Generated by Cython 3.0.2
Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.
Raw output: simulate_particle_field.c
+001: # cython: infer_types=True, wraparound=False, nonecheck=False, boundscheck=False, cdivision=True, language_level=3, profile=False, autogen_pxd=True
__pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (PyDict_SetItem(__pyx_t_7, __pyx_kp_u_simulate_particle_field_based_on_2, __pyx_kp_u_Simulate_a_particle_field_based) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
002:
003: from ..utils.random cimport _random
004: from ..transform.interpolation_catmull_rom cimport _interpolate
005: from ..generate.noise_add_gaussians cimport _render_erf_gaussian
006:
007: from libc.math cimport sqrt, fabs
008:
+009: import numpy as np
__pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
010: cimport numpy as np
011:
012: from cython.parallel import prange
+013: from tqdm import tqdm
__pyx_t_7 = PyList_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_n_s_tqdm); __Pyx_GIVEREF(__pyx_n_s_tqdm); if (__Pyx_PyList_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_tqdm)) __PYX_ERR(0, 13, __pyx_L1_error); __pyx_t_4 = __Pyx_Import(__pyx_n_s_tqdm, __pyx_t_7, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_tqdm); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (PyDict_SetItem(__pyx_d, __pyx_n_s_tqdm, __pyx_t_7) < 0) __PYX_ERR(0, 13, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
014:
+015: def simulate_particle_field_based_on_2D_PDF(image_pdf,
static PyObject *__pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_10__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
PyObject *__pyx_r = NULL;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("__defaults__", 0);
__Pyx_XDECREF(__pyx_r);
/* … */
__pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 15, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_min_particles);
__Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_min_particles);
if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_min_particles)) __PYX_ERR(0, 15, __pyx_L1_error);
__Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_max_particles);
__Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_max_particles);
if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_max_particles)) __PYX_ERR(0, 15, __pyx_L1_error);
__Pyx_GIVEREF(__pyx_t_1);
if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error);
__Pyx_GIVEREF(__pyx_t_2);
if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_2)) __PYX_ERR(0, 15, __pyx_L1_error);
__Pyx_INCREF(((PyObject *)__pyx_int_1));
__Pyx_GIVEREF(((PyObject *)__pyx_int_1));
if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 4, ((PyObject *)__pyx_int_1))) __PYX_ERR(0, 15, __pyx_L1_error);
__Pyx_GIVEREF(__pyx_t_3);
if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 5, __pyx_t_3)) __PYX_ERR(0, 15, __pyx_L1_error);
__pyx_t_1 = 0;
__pyx_t_2 = 0;
__pyx_t_3 = 0;
__pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 15, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__Pyx_GIVEREF(__pyx_t_4);
if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(0, 15, __pyx_L1_error);
__Pyx_INCREF(Py_None);
__Pyx_GIVEREF(Py_None);
if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, Py_None)) __PYX_ERR(0, 15, __pyx_L1_error);
__pyx_t_4 = 0;
__pyx_r = __pyx_t_3;
__pyx_t_3 = 0;
goto __pyx_L0;
/* function exit code */
__pyx_L1_error:;
__Pyx_XDECREF(__pyx_t_1);
__Pyx_XDECREF(__pyx_t_2);
__Pyx_XDECREF(__pyx_t_3);
__Pyx_XDECREF(__pyx_t_4);
__Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = NULL;
__pyx_L0:;
__Pyx_XGIVEREF(__pyx_r);
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_1simulate_particle_field_based_on_2D_PDF(PyObject *__pyx_self,
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8generate_23simulate_particle_field_simulate_particle_field_based_on_2D_PDF, "\n Simulate a particle field based on a 2D probability density function (PDF)\n :param image_pdf: 2D array of floats, the PDF\n :param min_particles: int, the minimum number of particles to simulate\n :param max_particles: int, the maximum number of particles to simulate\n :param min_distance: float, ensure that paricle distances are above minimum distance given\n :param mean_distance_threshold: float, the mean distance between closest particles, if the mean distance is below this threshold, the simulation will stop\n :param normalize: bint, whether or not the image requires normalization\n :param max_tries: int, the maximum number of tries to place particles before giving up\n :return: (2D array of floats, mean closest distance), for the first tupple element the shape is (n_particles, 2) where the last dimension is the x and y coordinates of the simulated particle\n\n The code does the following:\n 1. It samples the image PDF and places a particle at a point with a probability that is proportional to the PDF at that point.\n 2. It places the particles such that no two particles are closer than `min_distance` pixels.\n 3. It stops placing particles once the mean distance between all particles is less than `mean_distance_threshold` pixels.\n\n Example:\n >>> import numpy as np\n >>> image_pdf = np.random.random((100, 200)).astype(np.float32)\n >>> particles = simulate_particle_field_based_on_2D_PDF(image_pdf, min_particles=100, mean_distance_threshold=0.1)\n ");
static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_1simulate_particle_field_based_on_2D_PDF = {"simulate_particle_field_based_on_2D_PDF", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_1simulate_particle_field_based_on_2D_PDF, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8generate_23simulate_particle_field_simulate_particle_field_based_on_2D_PDF};
static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_1simulate_particle_field_based_on_2D_PDF(PyObject *__pyx_self,
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
PyObject *__pyx_v_image_pdf = 0;
PyObject *__pyx_v_min_particles = 0;
PyObject *__pyx_v_max_particles = 0;
double __pyx_v_min_distance;
double __pyx_v_mean_distance_threshold;
PyObject *__pyx_v_normalize = 0;
int __pyx_v_max_tries;
#if !CYTHON_METH_FASTCALL
CYTHON_UNUSED Py_ssize_t __pyx_nargs;
#endif
CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
PyObject *__pyx_r = 0;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("simulate_particle_field_based_on_2D_PDF (wrapper)", 0);
#if !CYTHON_METH_FASTCALL
#if CYTHON_ASSUME_SAFE_MACROS
__pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
#else
__pyx_nargs = PyTuple_Size(__pyx_args);
if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 15, __pyx_L3_error)
#endif
#endif
__pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
{
PyObject **__pyx_pyargnames[] = {&__pyx_n_s_image_pdf,&__pyx_n_s_min_particles,&__pyx_n_s_max_particles,&__pyx_n_s_min_distance,&__pyx_n_s_mean_distance_threshold,&__pyx_n_s_normalize,&__pyx_n_s_max_tries,0};
PyObject* values[7] = {0,0,0,0,0,0,0};
__pyx_defaults *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self);
values[1] = __Pyx_Arg_NewRef_FASTCALL(__pyx_dynamic_args->__pyx_arg_min_particles);
values[2] = __Pyx_Arg_NewRef_FASTCALL(__pyx_dynamic_args->__pyx_arg_max_particles);
values[5] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)((PyObject *)__pyx_int_1)));
if (__pyx_kwds) {
Py_ssize_t kw_args;
switch (__pyx_nargs) {
case 7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
CYTHON_FALLTHROUGH;
case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
CYTHON_FALLTHROUGH;
case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
CYTHON_FALLTHROUGH;
case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
CYTHON_FALLTHROUGH;
case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
CYTHON_FALLTHROUGH;
case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
CYTHON_FALLTHROUGH;
case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
CYTHON_FALLTHROUGH;
case 0: break;
default: goto __pyx_L5_argtuple_error;
}
kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
switch (__pyx_nargs) {
case 0:
if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_image_pdf)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)
else goto __pyx_L5_argtuple_error;
CYTHON_FALLTHROUGH;
case 1:
if (kw_args > 0) {
PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_min_particles);
if (value) { values[1] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 2:
if (kw_args > 0) {
PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_particles);
if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 3:
if (kw_args > 0) {
PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_min_distance);
if (value) { values[3] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 4:
if (kw_args > 0) {
PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_mean_distance_threshold);
if (value) { values[4] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 5:
if (kw_args > 0) {
PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_normalize);
if (value) { values[5] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 6:
if (kw_args > 0) {
PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_tries);
if (value) { values[6] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)
}
}
if (unlikely(kw_args > 0)) {
const Py_ssize_t kwd_pos_args = __pyx_nargs;
if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "simulate_particle_field_based_on_2D_PDF") < 0)) __PYX_ERR(0, 15, __pyx_L3_error)
}
} else {
switch (__pyx_nargs) {
case 7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
CYTHON_FALLTHROUGH;
case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
CYTHON_FALLTHROUGH;
case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
CYTHON_FALLTHROUGH;
case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
CYTHON_FALLTHROUGH;
case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
CYTHON_FALLTHROUGH;
case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
CYTHON_FALLTHROUGH;
case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
break;
default: goto __pyx_L5_argtuple_error;
}
}
__pyx_v_image_pdf = values[0];
__pyx_v_min_particles = ((PyObject*)values[1]);
__pyx_v_max_particles = ((PyObject*)values[2]);
if (values[3]) {
__pyx_v_min_distance = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_min_distance == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 17, __pyx_L3_error)
} else {
__pyx_v_min_distance = ((double)((double)0.1));
}
if (values[4]) {
__pyx_v_mean_distance_threshold = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_mean_distance_threshold == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 17, __pyx_L3_error)
} else {
__pyx_v_mean_distance_threshold = ((double)((double)0.0));
}
__pyx_v_normalize = values[5];
if (values[6]) {
__pyx_v_max_tries = __Pyx_PyInt_As_int(values[6]); if (unlikely((__pyx_v_max_tries == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 17, __pyx_L3_error)
} else {
__pyx_v_max_tries = ((int)((int)3));
}
}
goto __pyx_L4_argument_unpacking_done;
__pyx_L5_argtuple_error:;
__Pyx_RaiseArgtupleInvalid("simulate_particle_field_based_on_2D_PDF", 0, 1, 7, __pyx_nargs); __PYX_ERR(0, 15, __pyx_L3_error)
goto __pyx_L3_error;
__pyx_L3_error:;
{
Py_ssize_t __pyx_temp;
for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
__Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
}
}
__Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.simulate_particle_field_based_on_2D_PDF", __pyx_clineno, __pyx_lineno, __pyx_filename);
__Pyx_RefNannyFinishContext();
return NULL;
__pyx_L4_argument_unpacking_done:;
if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_min_particles), (&PyInt_Type), 0, "min_particles", 1))) __PYX_ERR(0, 16, __pyx_L1_error)
if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_max_particles), (&PyInt_Type), 0, "max_particles", 1))) __PYX_ERR(0, 16, __pyx_L1_error)
__pyx_r = __pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_simulate_particle_field_based_on_2D_PDF(__pyx_self, __pyx_v_image_pdf, __pyx_v_min_particles, __pyx_v_max_particles, __pyx_v_min_distance, __pyx_v_mean_distance_threshold, __pyx_v_normalize, __pyx_v_max_tries);
int __pyx_lineno = 0;
const char *__pyx_filename = NULL;
int __pyx_clineno = 0;
/* function exit code */
goto __pyx_L0;
__pyx_L1_error:;
__pyx_r = NULL;
__pyx_L0:;
{
Py_ssize_t __pyx_temp;
for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
__Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
}
}
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
static PyObject *__pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_simulate_particle_field_based_on_2D_PDF(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_image_pdf, PyObject *__pyx_v_min_particles, PyObject *__pyx_v_max_particles, double __pyx_v_min_distance, double __pyx_v_mean_distance_threshold, PyObject *__pyx_v_normalize, int __pyx_v_max_tries) {
PyObject *__pyx_v_valid_indices = NULL;
PyObject *__pyx_v_n_valid_indices = NULL;
PyObject *__pyx_v_selected_indices = NULL;
PyObject *__pyx_v_xp = NULL;
PyObject *__pyx_v_yp = NULL;
__Pyx_memviewslice __pyx_v__image_pdf = { 0, 0, { 0 }, { 0 }, { 0 } };
int __pyx_v__max_particles;
int __pyx_v__min_particles;
float __pyx_v__min_distance;
int __pyx_v__max_tries;
float __pyx_v__mean_distance_threshold;
__Pyx_memviewslice __pyx_v__xp = { 0, 0, { 0 }, { 0 }, { 0 } };
__Pyx_memviewslice __pyx_v__yp = { 0, 0, { 0 }, { 0 }, { 0 } };
CYTHON_UNUSED PyArrayObject *__pyx_v_particles_not_set = 0;
PyArrayObject *__pyx_v_particles_set = 0;
int __pyx_v_n_particles;
int __pyx_v_previous_n_particles;
int __pyx_v_p;
int __pyx_v_tries;
float __pyx_v_closest_distance;
float __pyx_v_closest_distance_sum;
float __pyx_v_mean_closest_distance;
PyObject *__pyx_v_progress_bar = NULL;
__Pyx_LocalBuf_ND __pyx_pybuffernd_particles_not_set;
__Pyx_Buffer __pyx_pybuffer_particles_not_set;
__Pyx_LocalBuf_ND __pyx_pybuffernd_particles_set;
__Pyx_Buffer __pyx_pybuffer_particles_set;
PyObject *__pyx_r = NULL;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("simulate_particle_field_based_on_2D_PDF", 0);
__Pyx_INCREF(__pyx_v_image_pdf);
__pyx_pybuffer_particles_not_set.pybuffer.buf = NULL;
__pyx_pybuffer_particles_not_set.refcount = 0;
__pyx_pybuffernd_particles_not_set.data = NULL;
__pyx_pybuffernd_particles_not_set.rcbuffer = &__pyx_pybuffer_particles_not_set;
__pyx_pybuffer_particles_set.pybuffer.buf = NULL;
__pyx_pybuffer_particles_set.refcount = 0;
__pyx_pybuffernd_particles_set.data = NULL;
__pyx_pybuffernd_particles_set.rcbuffer = &__pyx_pybuffer_particles_set;
/* … */
/* function exit code */
__pyx_L1_error:;
__Pyx_XDECREF(__pyx_t_2);
__Pyx_XDECREF(__pyx_t_3);
__Pyx_XDECREF(__pyx_t_4);
__Pyx_XDECREF(__pyx_t_7);
__Pyx_XDECREF(__pyx_t_8);
__PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
{ PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
__Pyx_PyThreadState_declare
__Pyx_PyThreadState_assign
__Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
__Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_particles_not_set.rcbuffer->pybuffer);
__Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_particles_set.rcbuffer->pybuffer);
__Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
__Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.simulate_particle_field_based_on_2D_PDF", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = NULL;
goto __pyx_L2;
__pyx_L0:;
__Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_particles_not_set.rcbuffer->pybuffer);
__Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_particles_set.rcbuffer->pybuffer);
__pyx_L2:;
__Pyx_XDECREF(__pyx_v_valid_indices);
__Pyx_XDECREF(__pyx_v_n_valid_indices);
__Pyx_XDECREF(__pyx_v_selected_indices);
__Pyx_XDECREF(__pyx_v_xp);
__Pyx_XDECREF(__pyx_v_yp);
__PYX_XCLEAR_MEMVIEW(&__pyx_v__image_pdf, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_v__xp, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_v__yp, 1);
__Pyx_XDECREF((PyObject *)__pyx_v_particles_not_set);
__Pyx_XDECREF((PyObject *)__pyx_v_particles_set);
__Pyx_XDECREF(__pyx_v_progress_bar);
__Pyx_XDECREF(__pyx_v_image_pdf);
__Pyx_XGIVEREF(__pyx_r);
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
/* … */
__pyx_tuple__26 = PyTuple_Pack(30, __pyx_n_s_image_pdf, __pyx_n_s_min_particles, __pyx_n_s_max_particles, __pyx_n_s_min_distance, __pyx_n_s_mean_distance_threshold, __pyx_n_s_normalize, __pyx_n_s_max_tries, __pyx_n_s_valid_indices, __pyx_n_s_n_valid_indices, __pyx_n_s_selected_indices, __pyx_n_s_xp, __pyx_n_s_yp, __pyx_n_s_image_pdf_2, __pyx_n_s_max_particles_2, __pyx_n_s_min_particles_2, __pyx_n_s_min_distance_2, __pyx_n_s_max_tries_2, __pyx_n_s_mean_distance_threshold_2, __pyx_n_s_xp_2, __pyx_n_s_yp_2, __pyx_n_s_particles_not_set, __pyx_n_s_particles_set, __pyx_n_s_n_particles, __pyx_n_s_previous_n_particles, __pyx_n_s_p, __pyx_n_s_tries, __pyx_n_s_closest_distance, __pyx_n_s_closest_distance_sum, __pyx_n_s_mean_closest_distance, __pyx_n_s_progress_bar); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 15, __pyx_L1_error)
__Pyx_GOTREF(__pyx_tuple__26);
__Pyx_GIVEREF(__pyx_tuple__26);
/* … */
__pyx_t_4 = __Pyx_PyDict_NewPresized(5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 15, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_min_particles, __pyx_n_s_int) < 0) __PYX_ERR(0, 15, __pyx_L1_error)
if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_max_particles, __pyx_n_s_int) < 0) __PYX_ERR(0, 15, __pyx_L1_error)
if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_min_distance, __pyx_n_s_float) < 0) __PYX_ERR(0, 15, __pyx_L1_error)
if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_mean_distance_threshold, __pyx_n_s_float) < 0) __PYX_ERR(0, 15, __pyx_L1_error)
if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_normalize, __pyx_n_s_bint) < 0) __PYX_ERR(0, 15, __pyx_L1_error)
__pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_1simulate_particle_field_based_on_2D_PDF, 0, __pyx_n_s_simulate_particle_field_based_on, NULL, __pyx_n_s_nanopyx_core_generate_simulate_p, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 15, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_7);
if (!__Pyx_CyFunction_InitDefaults(__pyx_t_7, sizeof(__pyx_defaults), 2)) __PYX_ERR(0, 15, __pyx_L1_error)
__pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(7, 0, 0, 30, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_generate_simula, __pyx_n_s_simulate_particle_field_based_on, 15, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 15, __pyx_L1_error)
+016: min_particles: int = 10, max_particles: int = 1000,
if (!(likely(__Pyx_Py3Int_CheckExact(__pyx_int_10)) || __Pyx_RaiseUnexpectedTypeError("int", __pyx_int_10))) __PYX_ERR(0, 16, __pyx_L1_error) __Pyx_INCREF(__pyx_int_10); __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_7)->__pyx_arg_min_particles = ((PyObject*)__pyx_int_10); __Pyx_GIVEREF(__pyx_int_10); if (!(likely(__Pyx_Py3Int_CheckExact(__pyx_int_1000)) || __Pyx_RaiseUnexpectedTypeError("int", __pyx_int_1000))) __PYX_ERR(0, 16, __pyx_L1_error) __Pyx_INCREF(__pyx_int_1000); __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_7)->__pyx_arg_max_particles = ((PyObject*)__pyx_int_1000); __Pyx_GIVEREF(__pyx_int_1000); __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_7, __pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_10__defaults__); __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_7, __pyx_t_4); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_d, __pyx_n_s_simulate_particle_field_based_on, __pyx_t_7) < 0) __PYX_ERR(0, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+017: min_distance: float = 0.1, mean_distance_threshold: float = 0, normalize: bint = 1, int max_tries = 3):
__pyx_t_1 = PyFloat_FromDouble(((double)0.1)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyFloat_FromDouble(((double)0.0)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyInt_From_int(((int)3)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3);
018: """
019: Simulate a particle field based on a 2D probability density function (PDF)
020: :param image_pdf: 2D array of floats, the PDF
021: :param min_particles: int, the minimum number of particles to simulate
022: :param max_particles: int, the maximum number of particles to simulate
023: :param min_distance: float, ensure that paricle distances are above minimum distance given
024: :param mean_distance_threshold: float, the mean distance between closest particles, if the mean distance is below this threshold, the simulation will stop
025: :param normalize: bint, whether or not the image requires normalization
026: :param max_tries: int, the maximum number of tries to place particles before giving up
027: :return: (2D array of floats, mean closest distance), for the first tupple element the shape is (n_particles, 2) where the last dimension is the x and y coordinates of the simulated particle
028:
029: The code does the following:
030: 1. It samples the image PDF and places a particle at a point with a probability that is proportional to the PDF at that point.
031: 2. It places the particles such that no two particles are closer than `min_distance` pixels.
032: 3. It stops placing particles once the mean distance between all particles is less than `mean_distance_threshold` pixels.
033:
034: Example:
035: >>> import numpy as np
036: >>> image_pdf = np.random.random((100, 200)).astype(np.float32)
037: >>> particles = simulate_particle_field_based_on_2D_PDF(image_pdf, min_particles=100, mean_distance_threshold=0.1)
038: """
+039: assert image_pdf.dtype == np.float32 and image_pdf.ndim == 2
#ifndef CYTHON_WITHOUT_ASSERTIONS
if (unlikely(__pyx_assertions_enabled())) {
__pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_image_pdf, __pyx_n_s_dtype); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2);
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_float32); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
if (__pyx_t_5) {
} else {
__pyx_t_1 = __pyx_t_5;
goto __pyx_L3_bool_binop_done;
}
__pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_image_pdf, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__pyx_t_5 = (__Pyx_PyInt_BoolEqObjC(__pyx_t_3, __pyx_int_2, 2, 0)); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(0, 39, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_t_1 = __pyx_t_5;
__pyx_L3_bool_binop_done:;
if (unlikely(!__pyx_t_1)) {
__Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0);
__PYX_ERR(0, 39, __pyx_L1_error)
}
}
#else
if ((1)); else __PYX_ERR(0, 39, __pyx_L1_error)
#endif
040:
+041: if normalize:
__pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_normalize); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 41, __pyx_L1_error) if (__pyx_t_1) { /* … */ }
+042: if image_pdf.max() == image_pdf.min(): # if the image_pdf has the same intensity all across the image..
__pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_image_pdf, __pyx_n_s_max); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 42, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[1] = {__pyx_t_2, }; __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 42, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_image_pdf, __pyx_n_s_min); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 42, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_7 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[1] = {__pyx_t_7, }; __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 42, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 42, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 42, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_1) { /* … */ goto __pyx_L6; }
+043: image_pdf = np.full_like(image_pdf, 0.5)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_full_like); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[3] = {__pyx_t_4, __pyx_v_image_pdf, __pyx_float_0_5}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 2+__pyx_t_6); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF_SET(__pyx_v_image_pdf, __pyx_t_2); __pyx_t_2 = 0;
044: else:
+045: image_pdf = (image_pdf - image_pdf.min()) / (image_pdf.max() - image_pdf.min())
/*else*/ {
__pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_image_pdf, __pyx_n_s_min); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__pyx_t_4 = NULL;
__pyx_t_6 = 0;
#if CYTHON_UNPACK_METHODS
if (likely(PyMethod_Check(__pyx_t_3))) {
__pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
if (likely(__pyx_t_4)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
__Pyx_INCREF(__pyx_t_4);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_3, function);
__pyx_t_6 = 1;
}
}
#endif
{
PyObject *__pyx_callargs[1] = {__pyx_t_4, };
__pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
__Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
}
__pyx_t_3 = PyNumber_Subtract(__pyx_v_image_pdf, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_image_pdf, __pyx_n_s_max); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__pyx_t_7 = NULL;
__pyx_t_6 = 0;
#if CYTHON_UNPACK_METHODS
if (likely(PyMethod_Check(__pyx_t_4))) {
__pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
if (likely(__pyx_t_7)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
__Pyx_INCREF(__pyx_t_7);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_4, function);
__pyx_t_6 = 1;
}
}
#endif
{
PyObject *__pyx_callargs[1] = {__pyx_t_7, };
__pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
__Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2);
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
}
__pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_image_pdf, __pyx_n_s_min); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_7);
__pyx_t_8 = NULL;
__pyx_t_6 = 0;
#if CYTHON_UNPACK_METHODS
if (likely(PyMethod_Check(__pyx_t_7))) {
__pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
if (likely(__pyx_t_8)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
__Pyx_INCREF(__pyx_t_8);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_7, function);
__pyx_t_6 = 1;
}
}
#endif
{
PyObject *__pyx_callargs[1] = {__pyx_t_8, };
__pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
__Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
}
__pyx_t_7 = PyNumber_Subtract(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_7);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__pyx_t_4 = __Pyx_PyNumber_Divide(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 45, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
__Pyx_DECREF_SET(__pyx_v_image_pdf, __pyx_t_4);
__pyx_t_4 = 0;
}
__pyx_L6:;
046: # image_pdf = image_pdf / np.linalg.norm(image_pdf, axis=1, keepdims=True)
047:
+048: assert np.max(image_pdf) <= 1.0 and np.min(image_pdf) >= 0.0
#ifndef CYTHON_WITHOUT_ASSERTIONS
if (unlikely(__pyx_assertions_enabled())) {
__Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_7);
__pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_max); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
__pyx_t_7 = NULL;
__pyx_t_6 = 0;
#if CYTHON_UNPACK_METHODS
if (unlikely(PyMethod_Check(__pyx_t_3))) {
__pyx_t_7 = PyMethod_GET_SELF(__pyx_t_3);
if (likely(__pyx_t_7)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
__Pyx_INCREF(__pyx_t_7);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_3, function);
__pyx_t_6 = 1;
}
}
#endif
{
PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_v_image_pdf};
__pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
__Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
}
__pyx_t_3 = PyObject_RichCompare(__pyx_t_4, __pyx_float_1_0, Py_LE); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
if (__pyx_t_5) {
} else {
__pyx_t_1 = __pyx_t_5;
goto __pyx_L7_bool_binop_done;
}
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_min); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_7);
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
__pyx_t_4 = NULL;
__pyx_t_6 = 0;
#if CYTHON_UNPACK_METHODS
if (unlikely(PyMethod_Check(__pyx_t_7))) {
__pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7);
if (likely(__pyx_t_4)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
__Pyx_INCREF(__pyx_t_4);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_7, function);
__pyx_t_6 = 1;
}
}
#endif
{
PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_image_pdf};
__pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6);
__Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_3);
__Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
}
__pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_float_0_0, Py_GE); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
__pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely((__pyx_t_5 < 0))) __PYX_ERR(0, 48, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
__pyx_t_1 = __pyx_t_5;
__pyx_L7_bool_binop_done:;
if (unlikely(!__pyx_t_1)) {
__Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0);
__PYX_ERR(0, 48, __pyx_L1_error)
}
}
#else
if ((1)); else __PYX_ERR(0, 48, __pyx_L1_error)
#endif
049:
050: # Check for values where the PDF is non-zero (and only place particles at those locations)
+051: valid_indices = np.nonzero(image_pdf > 0)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_nonzero); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyObject_RichCompare(__pyx_v_image_pdf, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 51, __pyx_L1_error) __pyx_t_2 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_t_3}; __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __pyx_v_valid_indices = __pyx_t_7; __pyx_t_7 = 0;
+052: valid_indices = np.transpose(valid_indices)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 52, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_transpose); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 52, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_valid_indices}; __pyx_t_7 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 52, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __Pyx_DECREF_SET(__pyx_v_valid_indices, __pyx_t_7); __pyx_t_7 = 0;
+053: n_valid_indices = valid_indices.shape[0]
__pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_valid_indices, __pyx_n_s_shape); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_7, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_v_n_valid_indices = __pyx_t_3; __pyx_t_3 = 0;
054:
+055: if n_valid_indices == 0:
__pyx_t_1 = (__Pyx_PyInt_BoolEqObjC(__pyx_v_n_valid_indices, __pyx_int_0, 0, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 55, __pyx_L1_error) if (unlikely(__pyx_t_1)) { /* … */ }
+056: raise ValueError("No valid locations found in the image PDF")
__pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 56, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(0, 56, __pyx_L1_error) /* … */ __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_No_valid_locations_found_in_the); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 56, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11);
057:
+058: np.random.shuffle(valid_indices)
__Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 58, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_random); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 58, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_shuffle); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 58, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_7))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_valid_indices}; __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 58, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+059: selected_indices = valid_indices[:int(max_particles),:]
__pyx_t_3 = __Pyx_PyNumber_Int(__pyx_v_max_particles); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 59, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = PySlice_New(Py_None, __pyx_t_3, Py_None); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 59, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 59, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_7); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7)) __PYX_ERR(0, 59, __pyx_L1_error); __Pyx_INCREF(__pyx_slice__5); __Pyx_GIVEREF(__pyx_slice__5); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_slice__5)) __PYX_ERR(0, 59, __pyx_L1_error); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_valid_indices, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 59, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_selected_indices = __pyx_t_7; __pyx_t_7 = 0;
060:
+061: xp = selected_indices[:, 1]
__pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_selected_indices, __pyx_tuple__12); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 61, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_v_xp = __pyx_t_7; __pyx_t_7 = 0; /* … */ __pyx_tuple__12 = PyTuple_Pack(2, __pyx_slice__5, __pyx_int_1); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 61, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__12); __Pyx_GIVEREF(__pyx_tuple__12);
+062: yp = selected_indices[:, 0]
__pyx_t_7 = __Pyx_PyObject_GetItem(__pyx_v_selected_indices, __pyx_tuple__13); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_v_yp = __pyx_t_7; __pyx_t_7 = 0; /* … */ __pyx_tuple__13 = PyTuple_Pack(2, __pyx_slice__5, __pyx_int_0); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__13); __Pyx_GIVEREF(__pyx_tuple__13);
063:
+064: cdef float[:,:] _image_pdf = image_pdf
__pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(__pyx_v_image_pdf, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 64, __pyx_L1_error) __pyx_v__image_pdf = __pyx_t_9; __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
065:
+066: cdef int _max_particles = max_particles
__pyx_t_6 = __Pyx_PyInt_As_int(__pyx_v_max_particles); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 66, __pyx_L1_error) __pyx_v__max_particles = __pyx_t_6;
+067: cdef int _min_particles = min_particles
__pyx_t_6 = __Pyx_PyInt_As_int(__pyx_v_min_particles); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 67, __pyx_L1_error) __pyx_v__min_particles = __pyx_t_6;
+068: cdef float _min_distance = min_distance
__pyx_v__min_distance = __pyx_v_min_distance;
+069: cdef int _max_tries = max_tries
__pyx_v__max_tries = __pyx_v_max_tries;
+070: cdef float _mean_distance_threshold = mean_distance_threshold
__pyx_v__mean_distance_threshold = __pyx_v_mean_distance_threshold;
071:
+072: xp = np.full(_max_particles, -999999, dtype=np.float32)
__Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_full); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v__max_particles); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_7); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_7)) __PYX_ERR(0, 72, __pyx_L1_error); __Pyx_INCREF(__pyx_int_neg_999999); __Pyx_GIVEREF(__pyx_int_neg_999999); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_neg_999999)) __PYX_ERR(0, 72, __pyx_L1_error); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float32); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF_SET(__pyx_v_xp, __pyx_t_8); __pyx_t_8 = 0;
+073: yp = np.full(_max_particles, -999999, dtype=np.float32)
__Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_full); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v__max_particles); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_8); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_8)) __PYX_ERR(0, 73, __pyx_L1_error); __Pyx_INCREF(__pyx_int_neg_999999); __Pyx_GIVEREF(__pyx_int_neg_999999); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_neg_999999)) __PYX_ERR(0, 73, __pyx_L1_error); __pyx_t_8 = 0; __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_4, __pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF_SET(__pyx_v_yp, __pyx_t_2); __pyx_t_2 = 0;
+074: cdef float[:] _xp = xp # xp exists in python land, _xp in c land as memoryview
__pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_ds_float(__pyx_v_xp, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 74, __pyx_L1_error) __pyx_v__xp = __pyx_t_10; __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
+075: cdef float[:] _yp = yp # same as above
__pyx_t_10 = __Pyx_PyObject_to_MemoryviewSlice_ds_float(__pyx_v_yp, PyBUF_WRITABLE); if (unlikely(!__pyx_t_10.memview)) __PYX_ERR(0, 75, __pyx_L1_error) __pyx_v__yp = __pyx_t_10; __pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
076:
077: cdef np.ndarray[np.int32_t, ndim=1] particles_not_set, particles_set
078:
+079: cdef int n_particles = 0
__pyx_v_n_particles = 0;
+080: cdef int previous_n_particles = 0
__pyx_v_previous_n_particles = 0;
081: cdef int p
+082: cdef int tries = 0
__pyx_v_tries = 0;
083: cdef float closest_distance, closest_distance_sum, mean_closest_distance
084:
085: # start by creating the minimal pool of particles
+086: with tqdm(total=max_particles, desc="Generating particles", unit="particles") as progress_bar:
/*with:*/ {
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_tqdm); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 86, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2);
__pyx_t_8 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 86, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_8);
if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_total, __pyx_v_max_particles) < 0) __PYX_ERR(0, 86, __pyx_L1_error)
if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_desc, __pyx_kp_u_Generating_particles) < 0) __PYX_ERR(0, 86, __pyx_L1_error)
if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_unit, __pyx_n_u_particles) < 0) __PYX_ERR(0, 86, __pyx_L1_error)
__pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_empty_tuple, __pyx_t_8); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 86, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_4);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
__pyx_t_11 = __Pyx_PyObject_LookupSpecial(__pyx_t_4, __pyx_n_s_exit); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 86, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_11);
__pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_t_4, __pyx_n_s_enter); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 86, __pyx_L10_error)
__Pyx_GOTREF(__pyx_t_2);
__pyx_t_7 = NULL;
__pyx_t_6 = 0;
#if CYTHON_UNPACK_METHODS
if (likely(PyMethod_Check(__pyx_t_2))) {
__pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2);
if (likely(__pyx_t_7)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
__Pyx_INCREF(__pyx_t_7);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_2, function);
__pyx_t_6 = 1;
}
}
#endif
{
PyObject *__pyx_callargs[1] = {__pyx_t_7, };
__pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 0+__pyx_t_6);
__Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 86, __pyx_L10_error)
__Pyx_GOTREF(__pyx_t_8);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
}
__pyx_t_2 = __pyx_t_8;
__pyx_t_8 = 0;
__Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/*try:*/ {
{
/*try:*/ {
__pyx_v_progress_bar = __pyx_t_2;
__pyx_t_2 = 0;
/* … */
}
__Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
__Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
__Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
goto __pyx_L19_try_end;
__pyx_L14_error:;
__PYX_XCLEAR_MEMVIEW(&__pyx_t_10, 1);
__pyx_t_10.memview = NULL; __pyx_t_10.data = NULL;
__Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
__Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
__Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
__Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
__Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
__PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
__pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
/*except:*/ {
__Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.simulate_particle_field_based_on_2D_PDF", __pyx_clineno, __pyx_lineno, __pyx_filename);
if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_4, &__pyx_t_8) < 0) __PYX_ERR(0, 86, __pyx_L16_except_error)
__Pyx_XGOTREF(__pyx_t_2);
__Pyx_XGOTREF(__pyx_t_4);
__Pyx_XGOTREF(__pyx_t_8);
__pyx_t_7 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_4, __pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 86, __pyx_L16_except_error)
__Pyx_GOTREF(__pyx_t_7);
__pyx_t_16 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_7, NULL);
__Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
__Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 86, __pyx_L16_except_error)
__Pyx_GOTREF(__pyx_t_16);
__pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_16);
__Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
if (__pyx_t_1 < 0) __PYX_ERR(0, 86, __pyx_L16_except_error)
__pyx_t_5 = (!__pyx_t_1);
if (unlikely(__pyx_t_5)) {
__Pyx_GIVEREF(__pyx_t_2);
__Pyx_GIVEREF(__pyx_t_4);
__Pyx_XGIVEREF(__pyx_t_8);
__Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_4, __pyx_t_8);
__pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_8 = 0;
__PYX_ERR(0, 86, __pyx_L16_except_error)
}
__Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
__Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
__Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
goto __pyx_L15_exception_handled;
}
__pyx_L16_except_error:;
__Pyx_XGIVEREF(__pyx_t_12);
__Pyx_XGIVEREF(__pyx_t_13);
__Pyx_XGIVEREF(__pyx_t_14);
__Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14);
goto __pyx_L1_error;
__pyx_L15_exception_handled:;
__Pyx_XGIVEREF(__pyx_t_12);
__Pyx_XGIVEREF(__pyx_t_13);
__Pyx_XGIVEREF(__pyx_t_14);
__Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14);
__pyx_L19_try_end:;
}
}
/*finally:*/ {
/*normal exit:*/{
if (__pyx_t_11) {
__pyx_t_14 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_tuple__14, NULL);
__Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 86, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_14);
__Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
}
goto __pyx_L13;
}
__pyx_L13:;
}
goto __pyx_L57;
__pyx_L10_error:;
__Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
goto __pyx_L1_error;
__pyx_L57:;
}
/* … */
__pyx_tuple__14 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 86, __pyx_L1_error)
__Pyx_GOTREF(__pyx_tuple__14);
__Pyx_GIVEREF(__pyx_tuple__14);
+087: while 1:
while (1) {
+088: particles_not_set = np.nonzero(xp < 0)[0].astype(np.int32) # get the index for the parciles not yet set
__Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 88, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_nonzero); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 88, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_8 = PyObject_RichCompare(__pyx_v_xp, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 88, __pyx_L14_error) __pyx_t_3 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_8}; __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 88, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 88, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_astype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 88, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 88, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_int32); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 88, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_8}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 88, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 88, __pyx_L14_error) __pyx_t_15 = ((PyArrayObject *)__pyx_t_2); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_particles_not_set.rcbuffer->pybuffer); __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_particles_not_set.rcbuffer->pybuffer, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack); if (unlikely(__pyx_t_6 < 0)) { PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_particles_not_set.rcbuffer->pybuffer, (PyObject*)__pyx_v_particles_not_set, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18); __Pyx_RaiseBufferFallbackError(); } else { PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18); } __pyx_t_16 = __pyx_t_17 = __pyx_t_18 = 0; } __pyx_pybuffernd_particles_not_set.diminfo[0].strides = __pyx_pybuffernd_particles_not_set.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_particles_not_set.diminfo[0].shape = __pyx_pybuffernd_particles_not_set.rcbuffer->pybuffer.shape[0]; if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 88, __pyx_L14_error) } __pyx_t_15 = 0; __Pyx_XDECREF_SET(__pyx_v_particles_not_set, ((PyArrayObject *)__pyx_t_2)); __pyx_t_2 = 0;
+089: with nogil:
{
#ifdef WITH_THREAD
PyThreadState *_save;
_save = NULL;
Py_UNBLOCK_THREADS
__Pyx_FastGIL_Remember();
#endif
/*try:*/ {
/* … */
/*finally:*/ {
/*normal exit:*/{
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L26;
}
__pyx_L25_error: {
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L14_error;
}
__pyx_L26:;
}
}
+090: for p in prange(particles_not_set.shape[0]):
__pyx_t_19 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_particles_not_set)); if (unlikely(__pyx_t_19 == ((npy_intp *)NULL) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 90, __pyx_L25_error) __pyx_t_20 = (__pyx_t_19[0]); { #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))))) #undef likely #undef unlikely #define likely(x) (x) #define unlikely(x) (x) #endif __pyx_t_22 = (__pyx_t_20 - 0 + 1 - 1/abs(1)) / 1; if (__pyx_t_22 > 0) { #ifdef _OPENMP #pragma omp parallel #endif /* _OPENMP */ { #ifdef _OPENMP #pragma omp for firstprivate(__pyx_v_p) lastprivate(__pyx_v_p) #endif /* _OPENMP */ for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_22; __pyx_t_21++){ { __pyx_v_p = (int)(0 + 1 * __pyx_t_21);
+091: _get_particle_candidate(_image_pdf, p, _xp, _yp, _min_distance) # find some particles
__pyx_t_1 = __pyx_f_7nanopyx_4core_8generate_23simulate_particle_field__get_particle_candidate(__pyx_v__image_pdf, __pyx_v_p, __pyx_v__xp, __pyx_v__yp, __pyx_v__min_distance); if (unlikely(__pyx_t_1 == ((int)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 91, __pyx_L29_error) goto __pyx_L32; __pyx_L29_error:; { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); #endif #ifdef _OPENMP #pragma omp flush(__pyx_parallel_exc_type) #endif /* _OPENMP */ if (!__pyx_parallel_exc_type) { __Pyx_ErrFetchWithState(&__pyx_parallel_exc_type, &__pyx_parallel_exc_value, &__pyx_parallel_exc_tb); __pyx_parallel_filename = __pyx_filename; __pyx_parallel_lineno = __pyx_lineno; __pyx_parallel_clineno = __pyx_clineno; __Pyx_GOTREF(__pyx_parallel_exc_type); } #ifdef WITH_THREAD __Pyx_PyGILState_Release(__pyx_gilstate_save); #endif } __pyx_parallel_why = 4; goto __pyx_L31; __pyx_L31:; #ifdef _OPENMP #pragma omp critical(__pyx_parallel_lastprivates4) #endif /* _OPENMP */ { __pyx_parallel_temp0 = __pyx_v_p; } __pyx_L32:; #ifdef _OPENMP #pragma omp flush(__pyx_parallel_why) #endif /* _OPENMP */ } } #ifdef _OPENMP Py_END_ALLOW_THREADS #else { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); #endif #endif /* _OPENMP */ /* Clean up any temporaries */ #ifdef WITH_THREAD __Pyx_PyGILState_Release(__pyx_gilstate_save); #endif #ifndef _OPENMP } #endif /* _OPENMP */ } } if (__pyx_parallel_exc_type) { /* This may have been overridden by a continue, break or return in another thread. Prefer the error. */ __pyx_parallel_why = 4; } if (__pyx_parallel_why) { __pyx_v_p = __pyx_parallel_temp0; switch (__pyx_parallel_why) { case 4: { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); #endif __Pyx_GIVEREF(__pyx_parallel_exc_type); __Pyx_ErrRestoreWithState(__pyx_parallel_exc_type, __pyx_parallel_exc_value, __pyx_parallel_exc_tb); __pyx_filename = __pyx_parallel_filename; __pyx_lineno = __pyx_parallel_lineno; __pyx_clineno = __pyx_parallel_clineno; #ifdef WITH_THREAD __Pyx_PyGILState_Release(__pyx_gilstate_save); #endif } goto __pyx_L25_error; } } } #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))))) #undef likely #undef unlikely #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #endif }
+092: particles_set = np.nonzero(xp >= 0)[0].astype(np.int32) # get the index for the parciles already set
__Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 92, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_nonzero); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 92, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_8 = PyObject_RichCompare(__pyx_v_xp, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 92, __pyx_L14_error) __pyx_t_3 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_8}; __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 92, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_astype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 92, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_int32); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 92, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_8}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 92, __pyx_L14_error) __pyx_t_15 = ((PyArrayObject *)__pyx_t_2); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_particles_set.rcbuffer->pybuffer); __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_particles_set.rcbuffer->pybuffer, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack); if (unlikely(__pyx_t_6 < 0)) { PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_particles_set.rcbuffer->pybuffer, (PyObject*)__pyx_v_particles_set, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16); __Pyx_RaiseBufferFallbackError(); } else { PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16); } __pyx_t_18 = __pyx_t_17 = __pyx_t_16 = 0; } __pyx_pybuffernd_particles_set.diminfo[0].strides = __pyx_pybuffernd_particles_set.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_particles_set.diminfo[0].shape = __pyx_pybuffernd_particles_set.rcbuffer->pybuffer.shape[0]; if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 92, __pyx_L14_error) } __pyx_t_15 = 0; __Pyx_XDECREF_SET(__pyx_v_particles_set, ((PyArrayObject *)__pyx_t_2)); __pyx_t_2 = 0;
+093: with nogil:
{
#ifdef WITH_THREAD
PyThreadState *_save;
_save = NULL;
Py_UNBLOCK_THREADS
__Pyx_FastGIL_Remember();
#endif
/*try:*/ {
/* … */
/*finally:*/ {
/*normal exit:*/{
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L37;
}
__pyx_L34_break: {
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L21_break;
}
__pyx_L36_error: {
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L14_error;
}
__pyx_L37:;
}
}
+094: n_particles = 0
__pyx_v_n_particles = 0;
+095: closest_distance_sum = 0
__pyx_v_closest_distance_sum = 0.0;
+096: for p in prange(particles_set.shape[0]):
__pyx_t_19 = __pyx_f_5numpy_7ndarray_5shape_shape(((PyArrayObject *)__pyx_v_particles_set)); if (unlikely(__pyx_t_19 == ((npy_intp *)NULL) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 96, __pyx_L36_error) __pyx_t_22 = (__pyx_t_19[0]); { #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))))) #undef likely #undef unlikely #define likely(x) (x) #define unlikely(x) (x) #endif __pyx_t_20 = (__pyx_t_22 - 0 + 1 - 1/abs(1)) / 1; if (__pyx_t_20 > 0) { #ifdef _OPENMP #pragma omp parallel #endif /* _OPENMP */ { #ifdef _OPENMP #pragma omp for lastprivate(__pyx_v_closest_distance) reduction(+:__pyx_v_closest_distance_sum) reduction(+:__pyx_v_n_particles) firstprivate(__pyx_v_p) lastprivate(__pyx_v_p) #endif /* _OPENMP */ for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21++){ { __pyx_v_p = (int)(0 + 1 * __pyx_t_21); /* Initialize private variables to invalid values */ __pyx_v_closest_distance = ((float)__PYX_NAN());
+097: closest_distance = _get_closest_distance(_xp[p], _yp[p], _xp, _yp)
__pyx_t_23 = __pyx_v_p;
__pyx_t_24 = __pyx_v_p;
__pyx_t_25 = __pyx_f_7nanopyx_4core_8generate_23simulate_particle_field__get_closest_distance((*((float *) ( /* dim=0 */ (__pyx_v__xp.data + __pyx_t_23 * __pyx_v__xp.strides[0]) ))), (*((float *) ( /* dim=0 */ (__pyx_v__yp.data + __pyx_t_24 * __pyx_v__yp.strides[0]) ))), __pyx_v__xp, __pyx_v__yp); if (unlikely(__pyx_t_25 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 97, __pyx_L40_error)
__pyx_v_closest_distance = __pyx_t_25;
+098: if closest_distance < _min_distance: # kickout particles found too close
__pyx_t_1 = (__pyx_v_closest_distance < __pyx_v__min_distance);
if (__pyx_t_1) {
/* … */
goto __pyx_L42;
}
+099: _xp[p] = -999999
__pyx_t_24 = __pyx_v_p;
*((float *) ( /* dim=0 */ (__pyx_v__xp.data + __pyx_t_24 * __pyx_v__xp.strides[0]) )) = -999999.0;
+100: _yp[p] = -999999
__pyx_t_24 = __pyx_v_p;
*((float *) ( /* dim=0 */ (__pyx_v__yp.data + __pyx_t_24 * __pyx_v__yp.strides[0]) )) = -999999.0;
101: else: # count the particles that are not kicked out
+102: closest_distance_sum += closest_distance
/*else*/ {
__pyx_v_closest_distance_sum = (__pyx_v_closest_distance_sum + __pyx_v_closest_distance);
+103: n_particles += 1
__pyx_v_n_particles = (__pyx_v_n_particles + 1);
}
__pyx_L42:;
goto __pyx_L44;
__pyx_L40_error:;
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
#ifdef _OPENMP
#pragma omp flush(__pyx_parallel_exc_type)
#endif /* _OPENMP */
if (!__pyx_parallel_exc_type) {
__Pyx_ErrFetchWithState(&__pyx_parallel_exc_type, &__pyx_parallel_exc_value, &__pyx_parallel_exc_tb);
__pyx_parallel_filename = __pyx_filename; __pyx_parallel_lineno = __pyx_lineno; __pyx_parallel_clineno = __pyx_clineno;
__Pyx_GOTREF(__pyx_parallel_exc_type);
}
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
}
__pyx_parallel_why = 4;
goto __pyx_L43;
__pyx_L43:;
#ifdef _OPENMP
#pragma omp critical(__pyx_parallel_lastprivates5)
#endif /* _OPENMP */
{
__pyx_parallel_temp0 = __pyx_v_closest_distance;
__pyx_parallel_temp1 = __pyx_v_closest_distance_sum;
__pyx_parallel_temp2 = __pyx_v_n_particles;
__pyx_parallel_temp3 = __pyx_v_p;
}
__pyx_L44:;
#ifdef _OPENMP
#pragma omp flush(__pyx_parallel_why)
#endif /* _OPENMP */
}
}
#ifdef _OPENMP
Py_END_ALLOW_THREADS
#else
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
#endif /* _OPENMP */
/* Clean up any temporaries */
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
#ifndef _OPENMP
}
#endif /* _OPENMP */
}
}
if (__pyx_parallel_exc_type) {
/* This may have been overridden by a continue, break or return in another thread. Prefer the error. */
__pyx_parallel_why = 4;
}
if (__pyx_parallel_why) {
__pyx_v_closest_distance = __pyx_parallel_temp0;
__pyx_v_closest_distance_sum = __pyx_parallel_temp1;
__pyx_v_n_particles = __pyx_parallel_temp2;
__pyx_v_p = __pyx_parallel_temp3;
switch (__pyx_parallel_why) {
case 4:
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
__Pyx_GIVEREF(__pyx_parallel_exc_type);
__Pyx_ErrRestoreWithState(__pyx_parallel_exc_type, __pyx_parallel_exc_value, __pyx_parallel_exc_tb);
__pyx_filename = __pyx_parallel_filename; __pyx_lineno = __pyx_parallel_lineno; __pyx_clineno = __pyx_parallel_clineno;
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
}
goto __pyx_L36_error;
}
}
}
#if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
#undef likely
#undef unlikely
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#endif
104:
105: # calculate the mean distance
+106: if n_particles > 0:
__pyx_t_1 = (__pyx_v_n_particles > 0);
if (__pyx_t_1) {
/* … */
}
+107: mean_closest_distance = closest_distance_sum / n_particles
__pyx_v_mean_closest_distance = (__pyx_v_closest_distance_sum / ((float)__pyx_v_n_particles));
108:
109: # check if the number of particles changed, if not increment the number of tries
+110: if n_particles == previous_n_particles:
__pyx_t_1 = (__pyx_v_n_particles == __pyx_v_previous_n_particles);
if (__pyx_t_1) {
/* … */
goto __pyx_L46;
}
+111: tries += 1
__pyx_v_tries = (__pyx_v_tries + 1);
112: else:
+113: tries = 0
/*else*/ {
__pyx_v_tries = 0;
}
__pyx_L46:;
114:
115: # too many tries without change in the number of parciles
+116: if n_particles == _max_particles or tries == _max_tries:
__pyx_t_5 = (__pyx_v_n_particles == __pyx_v__max_particles);
if (!__pyx_t_5) {
} else {
__pyx_t_1 = __pyx_t_5;
goto __pyx_L48_bool_binop_done;
}
__pyx_t_5 = (__pyx_v_tries == __pyx_v__max_tries);
__pyx_t_1 = __pyx_t_5;
__pyx_L48_bool_binop_done:;
if (__pyx_t_1) {
/* … */
}
+117: break
goto __pyx_L34_break;
118:
119: # check if the mean distance is below the threshold
+120: if _mean_distance_threshold > 0 and n_particles > _min_particles and mean_closest_distance < _mean_distance_threshold:
__pyx_t_5 = (__pyx_v__mean_distance_threshold > 0.0);
if (__pyx_t_5) {
} else {
__pyx_t_1 = __pyx_t_5;
goto __pyx_L51_bool_binop_done;
}
__pyx_t_5 = (__pyx_v_n_particles > __pyx_v__min_particles);
if (__pyx_t_5) {
} else {
__pyx_t_1 = __pyx_t_5;
goto __pyx_L51_bool_binop_done;
}
__pyx_t_5 = (__pyx_v_mean_closest_distance < __pyx_v__mean_distance_threshold);
__pyx_t_1 = __pyx_t_5;
__pyx_L51_bool_binop_done:;
if (__pyx_t_1) {
/* … */
}
}
+121: break
goto __pyx_L34_break;
122:
+123: progress_bar.update(n_particles-previous_n_particles)
__pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_progress_bar, __pyx_n_s_update); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_8 = __Pyx_PyInt_From_int((__pyx_v_n_particles - __pyx_v_previous_n_particles)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 123, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_7 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_8}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+124: previous_n_particles = n_particles
__pyx_v_previous_n_particles = __pyx_v_n_particles;
}
__pyx_L21_break:;
125:
126: # keep only set particles
+127: particles_set = np.nonzero(xp >= 0)[0].astype(np.int32)
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_nonzero); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_RichCompare(__pyx_v_xp, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error) __pyx_t_3 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_2}; __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_astype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_int32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_2}; __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } if (!(likely(((__pyx_t_8) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_8, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 127, __pyx_L1_error) __pyx_t_15 = ((PyArrayObject *)__pyx_t_8); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_particles_set.rcbuffer->pybuffer); __pyx_t_6 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_particles_set.rcbuffer->pybuffer, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack); if (unlikely(__pyx_t_6 < 0)) { PyErr_Fetch(&__pyx_t_11, &__pyx_t_14, &__pyx_t_13); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_particles_set.rcbuffer->pybuffer, (PyObject*)__pyx_v_particles_set, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_14); Py_XDECREF(__pyx_t_13); __Pyx_RaiseBufferFallbackError(); } else { PyErr_Restore(__pyx_t_11, __pyx_t_14, __pyx_t_13); } __pyx_t_11 = __pyx_t_14 = __pyx_t_13 = 0; } __pyx_pybuffernd_particles_set.diminfo[0].strides = __pyx_pybuffernd_particles_set.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_particles_set.diminfo[0].shape = __pyx_pybuffernd_particles_set.rcbuffer->pybuffer.shape[0]; if (unlikely((__pyx_t_6 < 0))) __PYX_ERR(0, 127, __pyx_L1_error) } __pyx_t_15 = 0; __Pyx_XDECREF_SET(__pyx_v_particles_set, ((PyArrayObject *)__pyx_t_8)); __pyx_t_8 = 0;
+128: xp = xp[particles_set]
__pyx_t_8 = __Pyx_PyObject_GetItem(__pyx_v_xp, ((PyObject *)__pyx_v_particles_set)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 128, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF_SET(__pyx_v_xp, __pyx_t_8); __pyx_t_8 = 0;
+129: yp = yp[particles_set]
__pyx_t_8 = __Pyx_PyObject_GetItem(__pyx_v_yp, ((PyObject *)__pyx_v_particles_set)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF_SET(__pyx_v_yp, __pyx_t_8); __pyx_t_8 = 0;
130:
+131: return np.array([xp, yp]).T, mean_closest_distance
__Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_array); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_xp); __Pyx_GIVEREF(__pyx_v_xp); if (__Pyx_PyList_SET_ITEM(__pyx_t_4, 0, __pyx_v_xp)) __PYX_ERR(0, 131, __pyx_L1_error); __Pyx_INCREF(__pyx_v_yp); __Pyx_GIVEREF(__pyx_v_yp); if (__Pyx_PyList_SET_ITEM(__pyx_t_4, 1, __pyx_v_yp)) __PYX_ERR(0, 131, __pyx_L1_error); __pyx_t_7 = NULL; __pyx_t_6 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_6 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_4}; __pyx_t_8 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_6, 1+__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_T); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_8 = PyFloat_FromDouble(__pyx_v_mean_closest_distance); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_2); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2)) __PYX_ERR(0, 131, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_8); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_8)) __PYX_ERR(0, 131, __pyx_L1_error); __pyx_t_2 = 0; __pyx_t_8 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0;
132:
133:
+134: cdef bint _get_particle_candidate(float[:, :] _image_pdf, int particle_index, float[:] xp, float[:] yp, float min_distance) nogil:
static int __pyx_f_7nanopyx_4core_8generate_23simulate_particle_field__get_particle_candidate(__Pyx_memviewslice __pyx_v__image_pdf, int __pyx_v_particle_index, __Pyx_memviewslice __pyx_v_xp, __Pyx_memviewslice __pyx_v_yp, float __pyx_v_min_distance) {
float __pyx_v_x;
float __pyx_v_y;
float __pyx_v_pdf;
float __pyx_v_r;
int __pyx_r;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("_get_particle_candidate", 1);
/* … */
/* function exit code */
__pyx_L1_error:;
#ifdef WITH_THREAD
__pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
__Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field._get_particle_candidate", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = -1;
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
__pyx_L0:;
__Pyx_RefNannyFinishContextNogil()
return __pyx_r;
}
135: """
136: Get a particle candidate by sampling the image PDF and placing a particle at a point with a probability that is proportional to the PDF at that point.
137: :param _image_pdf: 2D array of floats, the PDF
138: :param particle_index: int, the index of the particle to place
139: :param xp: 1D array of floats, the x coordinates of the particles
140: :param yp: 1D array of floats, the y coordinates of the particles
141: :param min_distance: float, ensure that particle distances are above minimum distance given
142: :return: 1 if a particle was placed, 0 if not
143: """
144:
+145: cdef float x = _random() * (_image_pdf.shape[1] - 1)
__pyx_t_1 = __pyx_f_7nanopyx_4core_5utils_6random__random(); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 145, __pyx_L1_error)
__pyx_v_x = (__pyx_t_1 * ((__pyx_v__image_pdf.shape[1]) - 1));
+146: cdef float y = _random() * (_image_pdf.shape[0] - 1)
__pyx_t_1 = __pyx_f_7nanopyx_4core_5utils_6random__random(); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 146, __pyx_L1_error)
__pyx_v_y = (__pyx_t_1 * ((__pyx_v__image_pdf.shape[0]) - 1));
+147: cdef float pdf = _interpolate(_image_pdf, x, y)
__pyx_t_2 = __pyx_f_7nanopyx_4core_9transform_25interpolation_catmull_rom__interpolate(__pyx_v__image_pdf, __pyx_v_x, __pyx_v_y); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 147, __pyx_L1_error)
__pyx_v_pdf = __pyx_t_2;
+148: cdef float r = _random()
__pyx_t_1 = __pyx_f_7nanopyx_4core_5utils_6random__random(); if (unlikely(__Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 148, __pyx_L1_error)
__pyx_v_r = __pyx_t_1;
149:
+150: if r < pdf and _get_closest_distance(x, y, xp, yp) > min_distance:
__pyx_t_4 = (__pyx_v_r < __pyx_v_pdf);
if (__pyx_t_4) {
} else {
__pyx_t_3 = __pyx_t_4;
goto __pyx_L4_bool_binop_done;
}
__pyx_t_1 = __pyx_f_7nanopyx_4core_8generate_23simulate_particle_field__get_closest_distance(__pyx_v_x, __pyx_v_y, __pyx_v_xp, __pyx_v_yp); if (unlikely(__pyx_t_1 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 150, __pyx_L1_error)
__pyx_t_4 = (__pyx_t_1 > __pyx_v_min_distance);
__pyx_t_3 = __pyx_t_4;
__pyx_L4_bool_binop_done:;
if (__pyx_t_3) {
/* … */
}
+151: xp[particle_index] = x
__pyx_t_5 = __pyx_v_particle_index;
*((float *) ( /* dim=0 */ (__pyx_v_xp.data + __pyx_t_5 * __pyx_v_xp.strides[0]) )) = __pyx_v_x;
+152: yp[particle_index] = y
__pyx_t_5 = __pyx_v_particle_index;
*((float *) ( /* dim=0 */ (__pyx_v_yp.data + __pyx_t_5 * __pyx_v_yp.strides[0]) )) = __pyx_v_y;
+153: return 1
__pyx_r = 1;
goto __pyx_L0;
154:
+155: return 0
__pyx_r = 0; goto __pyx_L0;
156:
157:
+158: cdef double _get_closest_distance(float x, float y, float[:] xp, float[:] yp) nogil:
static double __pyx_f_7nanopyx_4core_8generate_23simulate_particle_field__get_closest_distance(float __pyx_v_x, float __pyx_v_y, __Pyx_memviewslice __pyx_v_xp, __Pyx_memviewslice __pyx_v_yp) {
float __pyx_v__x;
float __pyx_v__y;
float __pyx_v__min_distance;
Py_ssize_t __pyx_v_i;
double __pyx_r;
/* … */
/* function exit code */
__pyx_L0:;
return __pyx_r;
}
159: """
160: Get the closest distance between a point and a set of particles.
161: Ignores particles with exact same location as x, y.
162: :param x: float, the x coordinate of the point
163: :param y: float, the y coordinate of the point
164: :param xp: 1D array of floats, the x coordinates of the particles
165: :param yp: 1D array of floats, the y coordinates of the particles
166: :return: double, the closest distance between the point and the particles
167: """
168:
169: cdef float _x, _y
+170: cdef float _min_distance = 999999999999
__pyx_v__min_distance = 999999999999.0;
171:
+172: for i in range(xp.shape[0]):
__pyx_t_1 = (__pyx_v_xp.shape[0]);
__pyx_t_2 = __pyx_t_1;
for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
__pyx_v_i = __pyx_t_3;
+173: _x = xp[i]
__pyx_t_4 = __pyx_v_i;
__pyx_v__x = (*((float *) ( /* dim=0 */ (__pyx_v_xp.data + __pyx_t_4 * __pyx_v_xp.strides[0]) )));
+174: _y = yp[i]
__pyx_t_4 = __pyx_v_i;
__pyx_v__y = (*((float *) ( /* dim=0 */ (__pyx_v_yp.data + __pyx_t_4 * __pyx_v_yp.strides[0]) )));
175:
+176: if _x < 0 or (x == _x and y == _y) or fabs(_x - x) > _min_distance or fabs(_y - y) > _min_distance:
__pyx_t_6 = (__pyx_v__x < 0.0);
if (!__pyx_t_6) {
} else {
__pyx_t_5 = __pyx_t_6;
goto __pyx_L6_bool_binop_done;
}
__pyx_t_6 = (__pyx_v_x == __pyx_v__x);
if (!__pyx_t_6) {
goto __pyx_L8_next_or;
} else {
}
__pyx_t_6 = (__pyx_v_y == __pyx_v__y);
if (!__pyx_t_6) {
} else {
__pyx_t_5 = __pyx_t_6;
goto __pyx_L6_bool_binop_done;
}
__pyx_L8_next_or:;
__pyx_t_6 = (fabs((__pyx_v__x - __pyx_v_x)) > __pyx_v__min_distance);
if (!__pyx_t_6) {
} else {
__pyx_t_5 = __pyx_t_6;
goto __pyx_L6_bool_binop_done;
}
__pyx_t_6 = (fabs((__pyx_v__y - __pyx_v_y)) > __pyx_v__min_distance);
__pyx_t_5 = __pyx_t_6;
__pyx_L6_bool_binop_done:;
if (__pyx_t_5) {
/* … */
}
+177: continue
goto __pyx_L3_continue;
178:
+179: _min_distance = min(_min_distance, sqrt((_x - x) ** 2 + (_y - y) ** 2))
__pyx_t_7 = sqrt((powf((__pyx_v__x - __pyx_v_x), 2.0) + powf((__pyx_v__y - __pyx_v_y), 2.0)));
__pyx_t_8 = __pyx_v__min_distance;
__pyx_t_5 = (__pyx_t_7 < __pyx_t_8);
if (__pyx_t_5) {
__pyx_t_9 = __pyx_t_7;
} else {
__pyx_t_9 = __pyx_t_8;
}
__pyx_v__min_distance = __pyx_t_9;
__pyx_L3_continue:;
}
180:
+181: return _min_distance
__pyx_r = __pyx_v__min_distance; goto __pyx_L0;
182:
183:
+184: def get_closest_distance(float[:,:] particle_field):
/* Python wrapper */ static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_3get_closest_distance(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8generate_23simulate_particle_field_2get_closest_distance, "\n Get the closest distance between all particles\n :param particle_field: 2D array of floats, the particle field\n :return: double, the closest distance between all particles\n "); static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_3get_closest_distance = {"get_closest_distance", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_3get_closest_distance, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8generate_23simulate_particle_field_2get_closest_distance}; static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_3get_closest_distance(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { __Pyx_memviewslice __pyx_v_particle_field = { 0, 0, { 0 }, { 0 }, { 0 } }; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("get_closest_distance (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 184, __pyx_L3_error) #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_particle_field,0}; PyObject* values[1] = {0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_particle_field)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 184, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "get_closest_distance") < 0)) __PYX_ERR(0, 184, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v_particle_field = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_particle_field.memview)) __PYX_ERR(0, 184, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("get_closest_distance", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 184, __pyx_L3_error) goto __pyx_L3_error; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __PYX_XCLEAR_MEMVIEW(&__pyx_v_particle_field, 1); __Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.get_closest_distance", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_2get_closest_distance(__pyx_self, __pyx_v_particle_field); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* function exit code */ __PYX_XCLEAR_MEMVIEW(&__pyx_v_particle_field, 1); { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_2get_closest_distance(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_particle_field) { __Pyx_memviewslice __pyx_v_xp = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_yp = { 0, 0, { 0 }, { 0 }, { 0 } }; float __pyx_v_closest_distance; int __pyx_v_p; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("get_closest_distance", 0); /* … */ /* function exit code */ __pyx_L1_error:; __PYX_XCLEAR_MEMVIEW(&__pyx_t_1, 1); __Pyx_XDECREF(__pyx_t_11); __Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.get_closest_distance", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __PYX_XCLEAR_MEMVIEW(&__pyx_v_xp, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_yp, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__28 = PyTuple_Pack(5, __pyx_n_s_particle_field, __pyx_n_s_xp, __pyx_n_s_yp, __pyx_n_s_closest_distance, __pyx_n_s_p); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 184, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__28); __Pyx_GIVEREF(__pyx_tuple__28); /* … */ __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_3get_closest_distance, 0, __pyx_n_s_get_closest_distance, NULL, __pyx_n_s_nanopyx_core_generate_simulate_p, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 184, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_closest_distance, __pyx_t_7) < 0) __PYX_ERR(0, 184, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_generate_simula, __pyx_n_s_get_closest_distance, 184, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 184, __pyx_L1_error)
185: """
186: Get the closest distance between all particles
187: :param particle_field: 2D array of floats, the particle field
188: :return: double, the closest distance between all particles
189: """
190:
+191: cdef float[:] xp = particle_field[:, 0]
__pyx_t_1.data = __pyx_v_particle_field.data;
__pyx_t_1.memview = __pyx_v_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_1, 1);
__pyx_t_1.shape[0] = __pyx_v_particle_field.shape[0];
__pyx_t_1.strides[0] = __pyx_v_particle_field.strides[0];
__pyx_t_1.suboffsets[0] = -1;
{
Py_ssize_t __pyx_tmp_idx = 0;
Py_ssize_t __pyx_tmp_stride = __pyx_v_particle_field.strides[1];
__pyx_t_1.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_v_xp = __pyx_t_1;
__pyx_t_1.memview = NULL;
__pyx_t_1.data = NULL;
+192: cdef float[:] yp = particle_field[:, 1]
__pyx_t_1.data = __pyx_v_particle_field.data;
__pyx_t_1.memview = __pyx_v_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_1, 1);
__pyx_t_1.shape[0] = __pyx_v_particle_field.shape[0];
__pyx_t_1.strides[0] = __pyx_v_particle_field.strides[0];
__pyx_t_1.suboffsets[0] = -1;
{
Py_ssize_t __pyx_tmp_idx = 1;
Py_ssize_t __pyx_tmp_stride = __pyx_v_particle_field.strides[1];
__pyx_t_1.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_v_yp = __pyx_t_1;
__pyx_t_1.memview = NULL;
__pyx_t_1.data = NULL;
193:
+194: cdef float closest_distance = 999999999999
__pyx_v_closest_distance = 999999999999.0;
195: cdef int p
196:
+197: with nogil:
{
#ifdef WITH_THREAD
PyThreadState *_save;
_save = NULL;
Py_UNBLOCK_THREADS
__Pyx_FastGIL_Remember();
#endif
/*try:*/ {
/* … */
/*finally:*/ {
/*normal exit:*/{
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L5;
}
__pyx_L4_error: {
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L1_error;
}
__pyx_L5:;
}
}
+198: for p in range(xp.shape[0]):
__pyx_t_2 = (__pyx_v_xp.shape[0]);
__pyx_t_3 = __pyx_t_2;
for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
__pyx_v_p = __pyx_t_4;
+199: if xp[p] < 0:
__pyx_t_5 = __pyx_v_p;
__pyx_t_6 = ((*((float *) ( /* dim=0 */ (__pyx_v_xp.data + __pyx_t_5 * __pyx_v_xp.strides[0]) ))) < 0.0);
if (__pyx_t_6) {
/* … */
}
+200: continue
goto __pyx_L6_continue;
+201: closest_distance = min(closest_distance, _get_closest_distance(xp[p], yp[p], xp, yp))
__pyx_t_5 = __pyx_v_p;
__pyx_t_7 = __pyx_v_p;
__pyx_t_8 = __pyx_f_7nanopyx_4core_8generate_23simulate_particle_field__get_closest_distance((*((float *) ( /* dim=0 */ (__pyx_v_xp.data + __pyx_t_5 * __pyx_v_xp.strides[0]) ))), (*((float *) ( /* dim=0 */ (__pyx_v_yp.data + __pyx_t_7 * __pyx_v_yp.strides[0]) ))), __pyx_v_xp, __pyx_v_yp); if (unlikely(__pyx_t_8 == ((double)-1) && __Pyx_ErrOccurredWithGIL())) __PYX_ERR(0, 201, __pyx_L4_error)
__pyx_t_9 = __pyx_v_closest_distance;
__pyx_t_6 = (__pyx_t_8 < __pyx_t_9);
if (__pyx_t_6) {
__pyx_t_10 = __pyx_t_8;
} else {
__pyx_t_10 = __pyx_t_9;
}
__pyx_v_closest_distance = __pyx_t_10;
__pyx_L6_continue:;
}
}
202:
+203: return closest_distance
__Pyx_XDECREF(__pyx_r); __pyx_t_11 = PyFloat_FromDouble(__pyx_v_closest_distance); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 203, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_r = __pyx_t_11; __pyx_t_11 = 0; goto __pyx_L0;
204:
205:
+206: def render_particle_histogram(float[:,:] particle_field, int h, int w, double amplitude, double sigma_x, double sigma_y):
/* Python wrapper */ static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_5render_particle_histogram(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8generate_23simulate_particle_field_4render_particle_histogram, "\n Render a particle field as an image\n :param particle_field: 2D array of floats, the particle field with shape (n_particles, 2) where the last dimension is the x and y coordinates of the particle\n :param w: int, the width of the image\n :param h: int, the height of the image\n :return: 2D array of floats, the rendered particle field\n "); static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_5render_particle_histogram = {"render_particle_histogram", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_5render_particle_histogram, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8generate_23simulate_particle_field_4render_particle_histogram}; static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_5render_particle_histogram(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { __Pyx_memviewslice __pyx_v_particle_field = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_h; int __pyx_v_w; double __pyx_v_amplitude; double __pyx_v_sigma_x; double __pyx_v_sigma_y; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("render_particle_histogram (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 206, __pyx_L3_error) #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_particle_field,&__pyx_n_s_h,&__pyx_n_s_w,&__pyx_n_s_amplitude,&__pyx_n_s_sigma_x,&__pyx_n_s_sigma_y,0}; PyObject* values[6] = {0,0,0,0,0,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_particle_field)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_h)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_particle_histogram", 1, 6, 6, 1); __PYX_ERR(0, 206, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_w)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_particle_histogram", 1, 6, 6, 2); __PYX_ERR(0, 206, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_amplitude)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_particle_histogram", 1, 6, 6, 3); __PYX_ERR(0, 206, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_x)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[4]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_particle_histogram", 1, 6, 6, 4); __PYX_ERR(0, 206, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_y)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[5]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_particle_histogram", 1, 6, 6, 5); __PYX_ERR(0, 206, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "render_particle_histogram") < 0)) __PYX_ERR(0, 206, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 6)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5); } __pyx_v_particle_field = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_particle_field.memview)) __PYX_ERR(0, 206, __pyx_L3_error) __pyx_v_h = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_h == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) __pyx_v_w = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_w == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) __pyx_v_amplitude = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_amplitude == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) __pyx_v_sigma_x = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_sigma_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) __pyx_v_sigma_y = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_sigma_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("render_particle_histogram", 1, 6, 6, __pyx_nargs); __PYX_ERR(0, 206, __pyx_L3_error) goto __pyx_L3_error; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __PYX_XCLEAR_MEMVIEW(&__pyx_v_particle_field, 1); __Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.render_particle_histogram", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_4render_particle_histogram(__pyx_self, __pyx_v_particle_field, __pyx_v_h, __pyx_v_w, __pyx_v_amplitude, __pyx_v_sigma_x, __pyx_v_sigma_y); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* function exit code */ __PYX_XCLEAR_MEMVIEW(&__pyx_v_particle_field, 1); { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_4render_particle_histogram(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_particle_field, int __pyx_v_h, int __pyx_v_w, double __pyx_v_amplitude, double __pyx_v_sigma_x, double __pyx_v_sigma_y) { PyObject *__pyx_v_image_particle_field = NULL; __Pyx_memviewslice __pyx_v__image_particle_field = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_n_particles; __Pyx_memviewslice __pyx_v_xp = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_yp = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_x; int __pyx_v_y; int __pyx_v_i; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("render_particle_histogram", 0); /* … */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __PYX_XCLEAR_MEMVIEW(&__pyx_t_6, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1); __Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.render_particle_histogram", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_image_particle_field); __PYX_XCLEAR_MEMVIEW(&__pyx_v__image_particle_field, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_xp, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_yp, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__30 = PyTuple_Pack(14, __pyx_n_s_particle_field, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_amplitude, __pyx_n_s_sigma_x, __pyx_n_s_sigma_y, __pyx_n_s_image_particle_field, __pyx_n_s_image_particle_field_2, __pyx_n_s_n_particles, __pyx_n_s_xp, __pyx_n_s_yp, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_i); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 206, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__30); __Pyx_GIVEREF(__pyx_tuple__30); /* … */ __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_5render_particle_histogram, 0, __pyx_n_s_render_particle_histogram, NULL, __pyx_n_s_nanopyx_core_generate_simulate_p, __pyx_d, ((PyObject *)__pyx_codeobj__31)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 206, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (PyDict_SetItem(__pyx_d, __pyx_n_s_render_particle_histogram, __pyx_t_7) < 0) __PYX_ERR(0, 206, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_generate_simula, __pyx_n_s_render_particle_histogram, 206, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 206, __pyx_L1_error)
207: """
208: Render a particle field as an image
209: :param particle_field: 2D array of floats, the particle field with shape (n_particles, 2) where the last dimension is the x and y coordinates of the particle
210: :param w: int, the width of the image
211: :param h: int, the height of the image
212: :return: 2D array of floats, the rendered particle field
213: """
214:
+215: image_particle_field = np.zeros((h, w), dtype=np.float32)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_h); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_w); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1)) __PYX_ERR(0, 215, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_3); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error); __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float32); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_image_particle_field = __pyx_t_5; __pyx_t_5 = 0;
+216: cdef float[:,:] _image_particle_field = image_particle_field
__pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(__pyx_v_image_particle_field, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 216, __pyx_L1_error) __pyx_v__image_particle_field = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
217:
+218: cdef int n_particles = particle_field.shape[0]
__pyx_v_n_particles = (__pyx_v_particle_field.shape[0]);
+219: cdef float[:] xp = particle_field[:, 0]
__pyx_t_7.data = __pyx_v_particle_field.data;
__pyx_t_7.memview = __pyx_v_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_7, 1);
__pyx_t_7.shape[0] = __pyx_v_particle_field.shape[0];
__pyx_t_7.strides[0] = __pyx_v_particle_field.strides[0];
__pyx_t_7.suboffsets[0] = -1;
{
Py_ssize_t __pyx_tmp_idx = 0;
Py_ssize_t __pyx_tmp_stride = __pyx_v_particle_field.strides[1];
__pyx_t_7.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_v_xp = __pyx_t_7;
__pyx_t_7.memview = NULL;
__pyx_t_7.data = NULL;
+220: cdef float[:] yp = particle_field[:, 1]
__pyx_t_7.data = __pyx_v_particle_field.data;
__pyx_t_7.memview = __pyx_v_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_7, 1);
__pyx_t_7.shape[0] = __pyx_v_particle_field.shape[0];
__pyx_t_7.strides[0] = __pyx_v_particle_field.strides[0];
__pyx_t_7.suboffsets[0] = -1;
{
Py_ssize_t __pyx_tmp_idx = 1;
Py_ssize_t __pyx_tmp_stride = __pyx_v_particle_field.strides[1];
__pyx_t_7.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_v_yp = __pyx_t_7;
__pyx_t_7.memview = NULL;
__pyx_t_7.data = NULL;
221:
222: cdef int x, y, i
223:
+224: with nogil:
{
#ifdef WITH_THREAD
PyThreadState *_save;
_save = NULL;
Py_UNBLOCK_THREADS
__Pyx_FastGIL_Remember();
#endif
/*try:*/ {
/* … */
/*finally:*/ {
/*normal exit:*/{
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L5;
}
__pyx_L4_error: {
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L1_error;
}
__pyx_L5:;
}
}
+225: for i in range(n_particles):
__pyx_t_8 = __pyx_v_n_particles;
__pyx_t_9 = __pyx_t_8;
for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
__pyx_v_i = __pyx_t_10;
+226: x = int(xp[i])
__pyx_t_11 = __pyx_v_i;
__pyx_v_x = ((int)(*((float *) ( /* dim=0 */ (__pyx_v_xp.data + __pyx_t_11 * __pyx_v_xp.strides[0]) ))));
+227: y = int(yp[i])
__pyx_t_11 = __pyx_v_i;
__pyx_v_y = ((int)(*((float *) ( /* dim=0 */ (__pyx_v_yp.data + __pyx_t_11 * __pyx_v_yp.strides[0]) ))));
+228: if 0 <= x < w or 0 <= y < h:
__pyx_t_13 = (0 <= __pyx_v_x);
if (__pyx_t_13) {
__pyx_t_13 = (__pyx_v_x < __pyx_v_w);
}
if (!__pyx_t_13) {
} else {
__pyx_t_12 = __pyx_t_13;
goto __pyx_L9_bool_binop_done;
}
__pyx_t_13 = (0 <= __pyx_v_y);
if (__pyx_t_13) {
__pyx_t_13 = (__pyx_v_y < __pyx_v_h);
}
__pyx_t_12 = __pyx_t_13;
__pyx_L9_bool_binop_done:;
if (__pyx_t_12) {
/* … */
}
}
}
229: # _image_particle_field[y, x] += 1
+230: _image_particle_field = _render_erf_gaussian(_image_particle_field, x, y, amplitude, sigma_x, sigma_y)
__pyx_t_6 = __pyx_f_7nanopyx_4core_8generate_19noise_add_gaussians__render_erf_gaussian(__pyx_v__image_particle_field, __pyx_v_x, __pyx_v_y, __pyx_v_amplitude, __pyx_v_sigma_x, __pyx_v_sigma_y); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 230, __pyx_L4_error)
__PYX_XCLEAR_MEMVIEW(&__pyx_v__image_particle_field, 0);
__pyx_v__image_particle_field = __pyx_t_6;
__pyx_t_6.memview = NULL;
__pyx_t_6.data = NULL;
231:
+232: return image_particle_field
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_image_particle_field); __pyx_r = __pyx_v_image_particle_field; goto __pyx_L0;
233:
234:
+235: def render_particle_histogram_with_tracks(float[:,:] particle_field, int[:,:] states, int h, int w):
/* Python wrapper */ static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_7render_particle_histogram_with_tracks(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8generate_23simulate_particle_field_6render_particle_histogram_with_tracks, "\n Render a particle field as an image stack\n :param particle_field: 2D array of floats, the particle field\n :param states: 2D array of ints, the states of the particles\n :param w: int, the width of the stack (in pixels)\n :param h: int, the height of the stack (in pixels)\n :return: 3D array of floats, the rendered particle field\n "); static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_7render_particle_histogram_with_tracks = {"render_particle_histogram_with_tracks", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_7render_particle_histogram_with_tracks, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8generate_23simulate_particle_field_6render_particle_histogram_with_tracks}; static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_7render_particle_histogram_with_tracks(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { __Pyx_memviewslice __pyx_v_particle_field = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_states = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_h; int __pyx_v_w; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("render_particle_histogram_with_tracks (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 235, __pyx_L3_error) #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_particle_field,&__pyx_n_s_states,&__pyx_n_s_h,&__pyx_n_s_w,0}; PyObject* values[4] = {0,0,0,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_particle_field)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_states)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_particle_histogram_with_tracks", 1, 4, 4, 1); __PYX_ERR(0, 235, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_h)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_particle_histogram_with_tracks", 1, 4, 4, 2); __PYX_ERR(0, 235, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_w)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_particle_histogram_with_tracks", 1, 4, 4, 3); __PYX_ERR(0, 235, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "render_particle_histogram_with_tracks") < 0)) __PYX_ERR(0, 235, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 4)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); } __pyx_v_particle_field = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_particle_field.memview)) __PYX_ERR(0, 235, __pyx_L3_error) __pyx_v_states = __Pyx_PyObject_to_MemoryviewSlice_dsds_int(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_states.memview)) __PYX_ERR(0, 235, __pyx_L3_error) __pyx_v_h = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_h == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L3_error) __pyx_v_w = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_w == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("render_particle_histogram_with_tracks", 1, 4, 4, __pyx_nargs); __PYX_ERR(0, 235, __pyx_L3_error) goto __pyx_L3_error; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __PYX_XCLEAR_MEMVIEW(&__pyx_v_particle_field, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_states, 1); __Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.render_particle_histogram_with_tracks", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_6render_particle_histogram_with_tracks(__pyx_self, __pyx_v_particle_field, __pyx_v_states, __pyx_v_h, __pyx_v_w); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* function exit code */ __PYX_XCLEAR_MEMVIEW(&__pyx_v_particle_field, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_states, 1); { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_6render_particle_histogram_with_tracks(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_particle_field, __Pyx_memviewslice __pyx_v_states, int __pyx_v_h, int __pyx_v_w) { int __pyx_v_n_frames; PyObject *__pyx_v_image_particle_field = NULL; __Pyx_memviewslice __pyx_v__image_particle_field = { 0, 0, { 0 }, { 0 }, { 0 } }; CYTHON_UNUSED int __pyx_v_n_particles; __Pyx_memviewslice __pyx_v_xp = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_yp = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_x; int __pyx_v_y; int __pyx_v_i; int __pyx_v_f; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("render_particle_histogram_with_tracks", 0); /* … */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1); __Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.render_particle_histogram_with_tracks", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_image_particle_field); __PYX_XCLEAR_MEMVIEW(&__pyx_v__image_particle_field, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_xp, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_yp, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__32 = PyTuple_Pack(14, __pyx_n_s_particle_field, __pyx_n_s_states, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_n_frames, __pyx_n_s_image_particle_field, __pyx_n_s_image_particle_field_2, __pyx_n_s_n_particles, __pyx_n_s_xp, __pyx_n_s_yp, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_i, __pyx_n_s_f); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 235, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__32); __Pyx_GIVEREF(__pyx_tuple__32); /* … */ __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_7render_particle_histogram_with_tracks, 0, __pyx_n_s_render_particle_histogram_with_t, NULL, __pyx_n_s_nanopyx_core_generate_simulate_p, __pyx_d, ((PyObject *)__pyx_codeobj__33)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 235, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (PyDict_SetItem(__pyx_d, __pyx_n_s_render_particle_histogram_with_t, __pyx_t_7) < 0) __PYX_ERR(0, 235, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(4, 0, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_generate_simula, __pyx_n_s_render_particle_histogram_with_t, 235, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(0, 235, __pyx_L1_error)
236: """
237: Render a particle field as an image stack
238: :param particle_field: 2D array of floats, the particle field
239: :param states: 2D array of ints, the states of the particles
240: :param w: int, the width of the stack (in pixels)
241: :param h: int, the height of the stack (in pixels)
242: :return: 3D array of floats, the rendered particle field
243: """
244:
+245: assert particle_field.shape[0] == states.shape[0]
#ifndef CYTHON_WITHOUT_ASSERTIONS
if (unlikely(__pyx_assertions_enabled())) {
__pyx_t_1 = ((__pyx_v_particle_field.shape[0]) == (__pyx_v_states.shape[0]));
if (unlikely(!__pyx_t_1)) {
__Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0);
__PYX_ERR(0, 245, __pyx_L1_error)
}
}
#else
if ((1)); else __PYX_ERR(0, 245, __pyx_L1_error)
#endif
246:
+247: cdef int n_frames = states.shape[1]
__pyx_v_n_frames = (__pyx_v_states.shape[1]);
248:
+249: image_particle_field = np.zeros((n_frames, h, w), dtype=np.float32)
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_frames); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_h); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_w); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_2); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_4); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_5); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_5)) __PYX_ERR(0, 249, __pyx_L1_error); __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error); __pyx_t_6 = 0; __pyx_t_6 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_image_particle_field = __pyx_t_2; __pyx_t_2 = 0;
+250: cdef float[:,:,:] _image_particle_field = image_particle_field
__pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(__pyx_v_image_particle_field, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 250, __pyx_L1_error) __pyx_v__image_particle_field = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
251:
+252: cdef int n_particles = particle_field.shape[0]
__pyx_v_n_particles = (__pyx_v_particle_field.shape[0]);
+253: cdef float[:] xp = particle_field[:, 0]
__pyx_t_8.data = __pyx_v_particle_field.data;
__pyx_t_8.memview = __pyx_v_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_8, 1);
__pyx_t_8.shape[0] = __pyx_v_particle_field.shape[0];
__pyx_t_8.strides[0] = __pyx_v_particle_field.strides[0];
__pyx_t_8.suboffsets[0] = -1;
{
Py_ssize_t __pyx_tmp_idx = 0;
Py_ssize_t __pyx_tmp_stride = __pyx_v_particle_field.strides[1];
__pyx_t_8.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_v_xp = __pyx_t_8;
__pyx_t_8.memview = NULL;
__pyx_t_8.data = NULL;
+254: cdef float[:] yp = particle_field[:, 1]
__pyx_t_8.data = __pyx_v_particle_field.data;
__pyx_t_8.memview = __pyx_v_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_8, 1);
__pyx_t_8.shape[0] = __pyx_v_particle_field.shape[0];
__pyx_t_8.strides[0] = __pyx_v_particle_field.strides[0];
__pyx_t_8.suboffsets[0] = -1;
{
Py_ssize_t __pyx_tmp_idx = 1;
Py_ssize_t __pyx_tmp_stride = __pyx_v_particle_field.strides[1];
__pyx_t_8.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_v_yp = __pyx_t_8;
__pyx_t_8.memview = NULL;
__pyx_t_8.data = NULL;
255:
256: cdef int x, y, i, f
257:
+258: with nogil:
{
#ifdef WITH_THREAD
PyThreadState *_save;
_save = NULL;
Py_UNBLOCK_THREADS
__Pyx_FastGIL_Remember();
#endif
/*try:*/ {
/* … */
/*finally:*/ {
/*normal exit:*/{
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L5;
}
__pyx_L5:;
}
}
+259: for i in prange(n_particles):
__pyx_t_9 = __pyx_v_n_particles;
{
#if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
#undef likely
#undef unlikely
#define likely(x) (x)
#define unlikely(x) (x)
#endif
__pyx_t_11 = (__pyx_t_9 - 0 + 1 - 1/abs(1)) / 1;
if (__pyx_t_11 > 0)
{
#ifdef _OPENMP
#pragma omp parallel
#endif /* _OPENMP */
{
#ifdef _OPENMP
#pragma omp for lastprivate(__pyx_v_f) firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_x) lastprivate(__pyx_v_y)
#endif /* _OPENMP */
for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_11; __pyx_t_10++){
{
__pyx_v_i = (int)(0 + 1 * __pyx_t_10);
/* Initialize private variables to invalid values */
__pyx_v_f = ((int)0xbad0bad0);
__pyx_v_x = ((int)0xbad0bad0);
__pyx_v_y = ((int)0xbad0bad0);
+260: x = int(xp[i])
__pyx_t_12 = __pyx_v_i;
__pyx_v_x = ((int)(*((float *) ( /* dim=0 */ (__pyx_v_xp.data + __pyx_t_12 * __pyx_v_xp.strides[0]) ))));
+261: y = int(yp[i])
__pyx_t_12 = __pyx_v_i;
__pyx_v_y = ((int)(*((float *) ( /* dim=0 */ (__pyx_v_yp.data + __pyx_t_12 * __pyx_v_yp.strides[0]) ))));
+262: if 0 <= x < w or 0 <= y < h:
__pyx_t_13 = (0 <= __pyx_v_x);
if (__pyx_t_13) {
__pyx_t_13 = (__pyx_v_x < __pyx_v_w);
}
if (!__pyx_t_13) {
} else {
__pyx_t_1 = __pyx_t_13;
goto __pyx_L11_bool_binop_done;
}
__pyx_t_13 = (0 <= __pyx_v_y);
if (__pyx_t_13) {
__pyx_t_13 = (__pyx_v_y < __pyx_v_h);
}
__pyx_t_1 = __pyx_t_13;
__pyx_L11_bool_binop_done:;
if (__pyx_t_1) {
/* … */
}
}
}
}
}
}
#if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
#undef likely
#undef unlikely
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#endif
}
+263: for f in range(n_frames):
__pyx_t_14 = __pyx_v_n_frames;
__pyx_t_15 = __pyx_t_14;
for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) {
__pyx_v_f = __pyx_t_16;
+264: if states[i, f] == 1:
__pyx_t_12 = __pyx_v_i;
__pyx_t_17 = __pyx_v_f;
__pyx_t_1 = ((*((int *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_states.data + __pyx_t_12 * __pyx_v_states.strides[0]) ) + __pyx_t_17 * __pyx_v_states.strides[1]) ))) == 1);
if (__pyx_t_1) {
/* … */
}
}
+265: _image_particle_field[f, y, x] += 1
__pyx_t_17 = __pyx_v_f;
__pyx_t_12 = __pyx_v_y;
__pyx_t_18 = __pyx_v_x;
*((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v__image_particle_field.data + __pyx_t_17 * __pyx_v__image_particle_field.strides[0]) ) + __pyx_t_12 * __pyx_v__image_particle_field.strides[1]) ) + __pyx_t_18 * __pyx_v__image_particle_field.strides[2]) )) += 1.0;
266:
+267: return image_particle_field
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_image_particle_field); __pyx_r = __pyx_v_image_particle_field; goto __pyx_L0;
268:
269:
+270: def render_particle_gaussians_with_tracks(float[:,:] particle_field, int[:,:] states, int h, int w, double amplitude, double sigma_x, double sigma_y):
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_9render_particle_gaussians_with_tracks(PyObject *__pyx_self,
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_9render_particle_gaussians_with_tracks = {"render_particle_gaussians_with_tracks", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_9render_particle_gaussians_with_tracks, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_7nanopyx_4core_8generate_23simulate_particle_field_9render_particle_gaussians_with_tracks(PyObject *__pyx_self,
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
__Pyx_memviewslice __pyx_v_particle_field = { 0, 0, { 0 }, { 0 }, { 0 } };
__Pyx_memviewslice __pyx_v_states = { 0, 0, { 0 }, { 0 }, { 0 } };
int __pyx_v_h;
int __pyx_v_w;
double __pyx_v_amplitude;
double __pyx_v_sigma_x;
double __pyx_v_sigma_y;
#if !CYTHON_METH_FASTCALL
CYTHON_UNUSED Py_ssize_t __pyx_nargs;
#endif
CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
PyObject *__pyx_r = 0;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("render_particle_gaussians_with_tracks (wrapper)", 0);
#if !CYTHON_METH_FASTCALL
#if CYTHON_ASSUME_SAFE_MACROS
__pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
#else
__pyx_nargs = PyTuple_Size(__pyx_args);
if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 270, __pyx_L3_error)
#endif
#endif
__pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
{
PyObject **__pyx_pyargnames[] = {&__pyx_n_s_particle_field,&__pyx_n_s_states,&__pyx_n_s_h,&__pyx_n_s_w,&__pyx_n_s_amplitude,&__pyx_n_s_sigma_x,&__pyx_n_s_sigma_y,0};
PyObject* values[7] = {0,0,0,0,0,0,0};
if (__pyx_kwds) {
Py_ssize_t kw_args;
switch (__pyx_nargs) {
case 7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
CYTHON_FALLTHROUGH;
case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
CYTHON_FALLTHROUGH;
case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
CYTHON_FALLTHROUGH;
case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
CYTHON_FALLTHROUGH;
case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
CYTHON_FALLTHROUGH;
case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
CYTHON_FALLTHROUGH;
case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
CYTHON_FALLTHROUGH;
case 0: break;
default: goto __pyx_L5_argtuple_error;
}
kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
switch (__pyx_nargs) {
case 0:
if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_particle_field)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
else goto __pyx_L5_argtuple_error;
CYTHON_FALLTHROUGH;
case 1:
if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_states)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_particle_gaussians_with_tracks", 1, 7, 7, 1); __PYX_ERR(0, 270, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 2:
if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_h)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_particle_gaussians_with_tracks", 1, 7, 7, 2); __PYX_ERR(0, 270, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 3:
if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_w)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_particle_gaussians_with_tracks", 1, 7, 7, 3); __PYX_ERR(0, 270, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 4:
if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_amplitude)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_particle_gaussians_with_tracks", 1, 7, 7, 4); __PYX_ERR(0, 270, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 5:
if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_x)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[5]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_particle_gaussians_with_tracks", 1, 7, 7, 5); __PYX_ERR(0, 270, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 6:
if (likely((values[6] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_y)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[6]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_particle_gaussians_with_tracks", 1, 7, 7, 6); __PYX_ERR(0, 270, __pyx_L3_error)
}
}
if (unlikely(kw_args > 0)) {
const Py_ssize_t kwd_pos_args = __pyx_nargs;
if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "render_particle_gaussians_with_tracks") < 0)) __PYX_ERR(0, 270, __pyx_L3_error)
}
} else if (unlikely(__pyx_nargs != 7)) {
goto __pyx_L5_argtuple_error;
} else {
values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
}
__pyx_v_particle_field = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_particle_field.memview)) __PYX_ERR(0, 270, __pyx_L3_error)
__pyx_v_states = __Pyx_PyObject_to_MemoryviewSlice_dsds_int(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_states.memview)) __PYX_ERR(0, 270, __pyx_L3_error)
__pyx_v_h = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_h == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
__pyx_v_w = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_w == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
__pyx_v_amplitude = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_amplitude == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
__pyx_v_sigma_x = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_sigma_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
__pyx_v_sigma_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sigma_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 270, __pyx_L3_error)
}
goto __pyx_L4_argument_unpacking_done;
__pyx_L5_argtuple_error:;
__Pyx_RaiseArgtupleInvalid("render_particle_gaussians_with_tracks", 1, 7, 7, __pyx_nargs); __PYX_ERR(0, 270, __pyx_L3_error)
goto __pyx_L3_error;
__pyx_L3_error:;
{
Py_ssize_t __pyx_temp;
for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
__Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
}
}
__PYX_XCLEAR_MEMVIEW(&__pyx_v_particle_field, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_v_states, 1);
__Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.render_particle_gaussians_with_tracks", __pyx_clineno, __pyx_lineno, __pyx_filename);
__Pyx_RefNannyFinishContext();
return NULL;
__pyx_L4_argument_unpacking_done:;
__pyx_r = __pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_8render_particle_gaussians_with_tracks(__pyx_self, __pyx_v_particle_field, __pyx_v_states, __pyx_v_h, __pyx_v_w, __pyx_v_amplitude, __pyx_v_sigma_x, __pyx_v_sigma_y);
int __pyx_lineno = 0;
const char *__pyx_filename = NULL;
int __pyx_clineno = 0;
/* function exit code */
__PYX_XCLEAR_MEMVIEW(&__pyx_v_particle_field, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_v_states, 1);
{
Py_ssize_t __pyx_temp;
for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
__Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
}
}
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
static PyObject *__pyx_pf_7nanopyx_4core_8generate_23simulate_particle_field_8render_particle_gaussians_with_tracks(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_particle_field, __Pyx_memviewslice __pyx_v_states, int __pyx_v_h, int __pyx_v_w, double __pyx_v_amplitude, double __pyx_v_sigma_x, double __pyx_v_sigma_y) {
int __pyx_v_n_frames;
PyObject *__pyx_v_image_particle_field = NULL;
__Pyx_memviewslice __pyx_v__image_particle_field = { 0, 0, { 0 }, { 0 }, { 0 } };
int __pyx_v_n_particles;
__Pyx_memviewslice __pyx_v_xp = { 0, 0, { 0 }, { 0 }, { 0 } };
__Pyx_memviewslice __pyx_v_yp = { 0, 0, { 0 }, { 0 }, { 0 } };
int __pyx_v_x;
int __pyx_v_y;
int __pyx_v_i;
int __pyx_v_f;
int __pyx_v_b;
CYTHON_UNUSED int __pyx_v_b_stop;
PyObject *__pyx_v_progress_bar = NULL;
PyObject *__pyx_r = NULL;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("render_particle_gaussians_with_tracks", 0);
/* … */
/* function exit code */
__pyx_L1_error:;
__Pyx_XDECREF(__pyx_t_2);
__Pyx_XDECREF(__pyx_t_3);
__Pyx_XDECREF(__pyx_t_4);
__Pyx_XDECREF(__pyx_t_5);
__Pyx_XDECREF(__pyx_t_6);
__PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_t_28, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_t_29, 1);
__Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.render_particle_gaussians_with_tracks", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = NULL;
__pyx_L0:;
__Pyx_XDECREF(__pyx_v_image_particle_field);
__PYX_XCLEAR_MEMVIEW(&__pyx_v__image_particle_field, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_v_xp, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_v_yp, 1);
__Pyx_XDECREF(__pyx_v_progress_bar);
__Pyx_XGIVEREF(__pyx_r);
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
/* … */
__pyx_tuple__34 = PyTuple_Pack(20, __pyx_n_s_particle_field, __pyx_n_s_states, __pyx_n_s_h, __pyx_n_s_w, __pyx_n_s_amplitude, __pyx_n_s_sigma_x, __pyx_n_s_sigma_y, __pyx_n_s_n_frames, __pyx_n_s_image_particle_field, __pyx_n_s_image_particle_field_2, __pyx_n_s_n_particles, __pyx_n_s_xp, __pyx_n_s_yp, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_i, __pyx_n_s_f, __pyx_n_s_b, __pyx_n_s_b_stop, __pyx_n_s_progress_bar); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 270, __pyx_L1_error)
__Pyx_GOTREF(__pyx_tuple__34);
__Pyx_GIVEREF(__pyx_tuple__34);
/* … */
__pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_23simulate_particle_field_9render_particle_gaussians_with_tracks, 0, __pyx_n_s_render_particle_gaussians_with_t, NULL, __pyx_n_s_nanopyx_core_generate_simulate_p, __pyx_d, ((PyObject *)__pyx_codeobj__35)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 270, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_7);
if (PyDict_SetItem(__pyx_d, __pyx_n_s_render_particle_gaussians_with_t, __pyx_t_7) < 0) __PYX_ERR(0, 270, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
271:
+272: assert particle_field.shape[0] == states.shape[0]
#ifndef CYTHON_WITHOUT_ASSERTIONS
if (unlikely(__pyx_assertions_enabled())) {
__pyx_t_1 = ((__pyx_v_particle_field.shape[0]) == (__pyx_v_states.shape[0]));
if (unlikely(!__pyx_t_1)) {
__Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0);
__PYX_ERR(0, 272, __pyx_L1_error)
}
}
#else
if ((1)); else __PYX_ERR(0, 272, __pyx_L1_error)
#endif
273:
+274: cdef int n_frames = states.shape[1]
__pyx_v_n_frames = (__pyx_v_states.shape[1]);
275:
+276: image_particle_field = np.zeros((n_frames, h, w), dtype=np.float32)
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_frames); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_h); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_w); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_2); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2)) __PYX_ERR(0, 276, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_4); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_4)) __PYX_ERR(0, 276, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_5); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_5)) __PYX_ERR(0, 276, __pyx_L1_error); __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6)) __PYX_ERR(0, 276, __pyx_L1_error); __pyx_t_6 = 0; __pyx_t_6 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 276, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_v_image_particle_field = __pyx_t_2; __pyx_t_2 = 0;
+277: cdef float[:,:,:] _image_particle_field = image_particle_field
__pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(__pyx_v_image_particle_field, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 277, __pyx_L1_error) __pyx_v__image_particle_field = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
278:
+279: cdef int n_particles = particle_field.shape[0]
__pyx_v_n_particles = (__pyx_v_particle_field.shape[0]);
+280: cdef float[:] xp = particle_field[:, 0]
__pyx_t_8.data = __pyx_v_particle_field.data;
__pyx_t_8.memview = __pyx_v_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_8, 1);
__pyx_t_8.shape[0] = __pyx_v_particle_field.shape[0];
__pyx_t_8.strides[0] = __pyx_v_particle_field.strides[0];
__pyx_t_8.suboffsets[0] = -1;
{
Py_ssize_t __pyx_tmp_idx = 0;
Py_ssize_t __pyx_tmp_stride = __pyx_v_particle_field.strides[1];
__pyx_t_8.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_v_xp = __pyx_t_8;
__pyx_t_8.memview = NULL;
__pyx_t_8.data = NULL;
+281: cdef float[:] yp = particle_field[:, 1]
__pyx_t_8.data = __pyx_v_particle_field.data;
__pyx_t_8.memview = __pyx_v_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_8, 1);
__pyx_t_8.shape[0] = __pyx_v_particle_field.shape[0];
__pyx_t_8.strides[0] = __pyx_v_particle_field.strides[0];
__pyx_t_8.suboffsets[0] = -1;
{
Py_ssize_t __pyx_tmp_idx = 1;
Py_ssize_t __pyx_tmp_stride = __pyx_v_particle_field.strides[1];
__pyx_t_8.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_v_yp = __pyx_t_8;
__pyx_t_8.memview = NULL;
__pyx_t_8.data = NULL;
282:
283: cdef int x, y, i, f, b, b_stop
284:
285: # break into 100 particles at a time
+286: with tqdm(total=n_particles, desc="Rendering particles", unit="particles") as progress_bar:
/*with:*/ {
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_tqdm); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 286, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_2);
__pyx_t_6 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 286, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_6);
__pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_particles); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 286, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_5);
if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_total, __pyx_t_5) < 0) __PYX_ERR(0, 286, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_desc, __pyx_kp_u_Rendering_particles) < 0) __PYX_ERR(0, 286, __pyx_L1_error)
if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_unit, __pyx_n_u_particles) < 0) __PYX_ERR(0, 286, __pyx_L1_error)
__pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_empty_tuple, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 286, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_5);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
__Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
__pyx_t_9 = __Pyx_PyObject_LookupSpecial(__pyx_t_5, __pyx_n_s_exit); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 286, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_9);
__pyx_t_2 = __Pyx_PyObject_LookupSpecial(__pyx_t_5, __pyx_n_s_enter); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 286, __pyx_L3_error)
__Pyx_GOTREF(__pyx_t_2);
__pyx_t_3 = NULL;
__pyx_t_10 = 0;
#if CYTHON_UNPACK_METHODS
if (likely(PyMethod_Check(__pyx_t_2))) {
__pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
if (likely(__pyx_t_3)) {
PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
__Pyx_INCREF(__pyx_t_3);
__Pyx_INCREF(function);
__Pyx_DECREF_SET(__pyx_t_2, function);
__pyx_t_10 = 1;
}
}
#endif
{
PyObject *__pyx_callargs[1] = {__pyx_t_3, };
__pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_10, 0+__pyx_t_10);
__Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 286, __pyx_L3_error)
__Pyx_GOTREF(__pyx_t_6);
__Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
}
__pyx_t_2 = __pyx_t_6;
__pyx_t_6 = 0;
__Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
/*try:*/ {
{
/*try:*/ {
__pyx_v_progress_bar = __pyx_t_2;
__pyx_t_2 = 0;
/* … */
}
__Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
__Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
__Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
goto __pyx_L12_try_end;
__pyx_L7_error:;
__Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
__PYX_XCLEAR_MEMVIEW(&__pyx_t_28, 1);
__pyx_t_28.memview = NULL; __pyx_t_28.data = NULL;
__PYX_XCLEAR_MEMVIEW(&__pyx_t_29, 1);
__pyx_t_29.memview = NULL; __pyx_t_29.data = NULL;
__Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
__Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
__Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
__Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
__PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
__pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
__PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
__pyx_t_8.memview = NULL; __pyx_t_8.data = NULL;
/*except:*/ {
__Pyx_AddTraceback("nanopyx.core.generate.simulate_particle_field.render_particle_gaussians_with_tracks", __pyx_clineno, __pyx_lineno, __pyx_filename);
if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_5, &__pyx_t_6) < 0) __PYX_ERR(0, 286, __pyx_L9_except_error)
__Pyx_XGOTREF(__pyx_t_2);
__Pyx_XGOTREF(__pyx_t_5);
__Pyx_XGOTREF(__pyx_t_6);
__pyx_t_3 = PyTuple_Pack(3, __pyx_t_2, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 286, __pyx_L9_except_error)
__Pyx_GOTREF(__pyx_t_3);
__pyx_t_30 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_3, NULL);
__Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
__Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
if (unlikely(!__pyx_t_30)) __PYX_ERR(0, 286, __pyx_L9_except_error)
__Pyx_GOTREF(__pyx_t_30);
__pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_30);
__Pyx_DECREF(__pyx_t_30); __pyx_t_30 = 0;
if (__pyx_t_1 < 0) __PYX_ERR(0, 286, __pyx_L9_except_error)
__pyx_t_23 = (!__pyx_t_1);
if (unlikely(__pyx_t_23)) {
__Pyx_GIVEREF(__pyx_t_2);
__Pyx_GIVEREF(__pyx_t_5);
__Pyx_XGIVEREF(__pyx_t_6);
__Pyx_ErrRestoreWithState(__pyx_t_2, __pyx_t_5, __pyx_t_6);
__pyx_t_2 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0;
__PYX_ERR(0, 286, __pyx_L9_except_error)
}
__Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
__Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
__Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
goto __pyx_L8_exception_handled;
}
__pyx_L9_except_error:;
__Pyx_XGIVEREF(__pyx_t_11);
__Pyx_XGIVEREF(__pyx_t_12);
__Pyx_XGIVEREF(__pyx_t_13);
__Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13);
goto __pyx_L1_error;
__pyx_L8_exception_handled:;
__Pyx_XGIVEREF(__pyx_t_11);
__Pyx_XGIVEREF(__pyx_t_12);
__Pyx_XGIVEREF(__pyx_t_13);
__Pyx_ExceptionReset(__pyx_t_11, __pyx_t_12, __pyx_t_13);
__pyx_L12_try_end:;
}
}
/*finally:*/ {
/*normal exit:*/{
if (__pyx_t_9) {
__pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_tuple__14, NULL);
__Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 286, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_13);
__Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
}
goto __pyx_L6;
}
__pyx_L6:;
}
goto __pyx_L35;
__pyx_L3_error:;
__Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
goto __pyx_L1_error;
__pyx_L35:;
}
+287: for b in range(0, n_particles, 100):
__pyx_t_10 = __pyx_v_n_particles;
__pyx_t_14 = __pyx_t_10;
for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=0x64) {
__pyx_v_b = __pyx_t_15;
+288: with nogil:
{
#ifdef WITH_THREAD
PyThreadState *_save;
_save = NULL;
Py_UNBLOCK_THREADS
__Pyx_FastGIL_Remember();
#endif
/*try:*/ {
/* … */
/*finally:*/ {
/*normal exit:*/{
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L19;
}
__pyx_L18_error: {
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L7_error;
}
__pyx_L19:;
}
}
+289: b_stop = min(b + 100, n_particles)
__pyx_t_16 = __pyx_v_n_particles;
__pyx_t_17 = (__pyx_v_b + 0x64);
__pyx_t_1 = (__pyx_t_16 < __pyx_t_17);
if (__pyx_t_1) {
__pyx_t_18 = __pyx_t_16;
} else {
__pyx_t_18 = __pyx_t_17;
}
__pyx_v_b_stop = __pyx_t_18;
+290: for i in prange(b, b_stop):
__pyx_t_16 = __pyx_v_b;
__pyx_t_19 = __pyx_v_b_stop;
{
#if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
#undef likely
#undef unlikely
#define likely(x) (x)
#define unlikely(x) (x)
#endif
__pyx_t_21 = (__pyx_t_19 - __pyx_t_16 + 1 - 1/abs(1)) / 1;
if (__pyx_t_21 > 0)
{
#ifdef _OPENMP
#pragma omp parallel
#endif /* _OPENMP */
{
#ifdef _OPENMP
#pragma omp for lastprivate(__pyx_v_f) firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) lastprivate(__pyx_v_x) lastprivate(__pyx_v_y)
#endif /* _OPENMP */
for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_21; __pyx_t_20++){
{
__pyx_v_i = (int)(__pyx_t_16 + 1 * __pyx_t_20);
/* Initialize private variables to invalid values */
__pyx_v_f = ((int)0xbad0bad0);
__pyx_v_x = ((int)0xbad0bad0);
__pyx_v_y = ((int)0xbad0bad0);
+291: x = int(xp[i])
__pyx_t_22 = __pyx_v_i;
__pyx_v_x = ((int)(*((float *) ( /* dim=0 */ (__pyx_v_xp.data + __pyx_t_22 * __pyx_v_xp.strides[0]) ))));
+292: y = int(yp[i])
__pyx_t_22 = __pyx_v_i;
__pyx_v_y = ((int)(*((float *) ( /* dim=0 */ (__pyx_v_yp.data + __pyx_t_22 * __pyx_v_yp.strides[0]) ))));
+293: if 0 <= x < w or 0 <= y < h:
__pyx_t_23 = (0 <= __pyx_v_x);
if (__pyx_t_23) {
__pyx_t_23 = (__pyx_v_x < __pyx_v_w);
}
if (!__pyx_t_23) {
} else {
__pyx_t_1 = __pyx_t_23;
goto __pyx_L25_bool_binop_done;
}
__pyx_t_23 = (0 <= __pyx_v_y);
if (__pyx_t_23) {
__pyx_t_23 = (__pyx_v_y < __pyx_v_h);
}
__pyx_t_1 = __pyx_t_23;
__pyx_L25_bool_binop_done:;
if (__pyx_t_1) {
/* … */
}
goto __pyx_L31;
__pyx_L22_error:;
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
#ifdef _OPENMP
#pragma omp flush(__pyx_parallel_exc_type)
#endif /* _OPENMP */
if (!__pyx_parallel_exc_type) {
__Pyx_ErrFetchWithState(&__pyx_parallel_exc_type, &__pyx_parallel_exc_value, &__pyx_parallel_exc_tb);
__pyx_parallel_filename = __pyx_filename; __pyx_parallel_lineno = __pyx_lineno; __pyx_parallel_clineno = __pyx_clineno;
__Pyx_GOTREF(__pyx_parallel_exc_type);
}
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
}
__pyx_parallel_why = 4;
goto __pyx_L30;
__pyx_L30:;
#ifdef _OPENMP
#pragma omp critical(__pyx_parallel_lastprivates6)
#endif /* _OPENMP */
{
__pyx_parallel_temp0 = __pyx_v_f;
__pyx_parallel_temp1 = __pyx_v_i;
__pyx_parallel_temp2 = __pyx_v_x;
__pyx_parallel_temp3 = __pyx_v_y;
}
__pyx_L31:;
#ifdef _OPENMP
#pragma omp flush(__pyx_parallel_why)
#endif /* _OPENMP */
}
}
#ifdef _OPENMP
Py_END_ALLOW_THREADS
#else
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
#endif /* _OPENMP */
/* Clean up any temporaries */
__PYX_XCLEAR_MEMVIEW(&__pyx_t_28, 0);
__pyx_t_28.memview = NULL; __pyx_t_28.data = NULL;
__PYX_XCLEAR_MEMVIEW(&__pyx_t_29, 0);
__pyx_t_29.memview = NULL; __pyx_t_29.data = NULL;
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
#ifndef _OPENMP
}
#endif /* _OPENMP */
}
}
if (__pyx_parallel_exc_type) {
/* This may have been overridden by a continue, break or return in another thread. Prefer the error. */
__pyx_parallel_why = 4;
}
if (__pyx_parallel_why) {
__pyx_v_f = __pyx_parallel_temp0;
__pyx_v_i = __pyx_parallel_temp1;
__pyx_v_x = __pyx_parallel_temp2;
__pyx_v_y = __pyx_parallel_temp3;
switch (__pyx_parallel_why) {
case 4:
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
__Pyx_GIVEREF(__pyx_parallel_exc_type);
__Pyx_ErrRestoreWithState(__pyx_parallel_exc_type, __pyx_parallel_exc_value, __pyx_parallel_exc_tb);
__pyx_filename = __pyx_parallel_filename; __pyx_lineno = __pyx_parallel_lineno; __pyx_clineno = __pyx_parallel_clineno;
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
}
goto __pyx_L18_error;
}
}
}
#if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
#undef likely
#undef unlikely
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#endif
}
+294: for f in range(n_frames):
__pyx_t_24 = __pyx_v_n_frames;
__pyx_t_25 = __pyx_t_24;
for (__pyx_t_26 = 0; __pyx_t_26 < __pyx_t_25; __pyx_t_26+=1) {
__pyx_v_f = __pyx_t_26;
+295: if states[i, f] == 1:
__pyx_t_22 = __pyx_v_i;
__pyx_t_27 = __pyx_v_f;
__pyx_t_1 = ((*((int *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_states.data + __pyx_t_22 * __pyx_v_states.strides[0]) ) + __pyx_t_27 * __pyx_v_states.strides[1]) ))) == 1);
if (__pyx_t_1) {
/* … */
}
}
+296: _render_erf_gaussian(_image_particle_field[f], x, y, amplitude, sigma_x, sigma_y)
__pyx_t_28.data = __pyx_v__image_particle_field.data;
__pyx_t_28.memview = __pyx_v__image_particle_field.memview;
__PYX_INC_MEMVIEW(&__pyx_t_28, 0);
{
Py_ssize_t __pyx_tmp_idx = __pyx_v_f;
Py_ssize_t __pyx_tmp_stride = __pyx_v__image_particle_field.strides[0];
__pyx_t_28.data += __pyx_tmp_idx * __pyx_tmp_stride;
}
__pyx_t_28.shape[0] = __pyx_v__image_particle_field.shape[1];
__pyx_t_28.strides[0] = __pyx_v__image_particle_field.strides[1];
__pyx_t_28.suboffsets[0] = -1;
__pyx_t_28.shape[1] = __pyx_v__image_particle_field.shape[2];
__pyx_t_28.strides[1] = __pyx_v__image_particle_field.strides[2];
__pyx_t_28.suboffsets[1] = -1;
__pyx_t_29 = __pyx_f_7nanopyx_4core_8generate_19noise_add_gaussians__render_erf_gaussian(__pyx_t_28, __pyx_v_x, __pyx_v_y, __pyx_v_amplitude, __pyx_v_sigma_x, __pyx_v_sigma_y); if (unlikely(!__pyx_t_29.memview)) __PYX_ERR(0, 296, __pyx_L22_error)
__PYX_XCLEAR_MEMVIEW(&__pyx_t_28, 0);
__pyx_t_28.memview = NULL; __pyx_t_28.data = NULL;
__PYX_XCLEAR_MEMVIEW(&__pyx_t_29, 0);
__pyx_t_29.memview = NULL; __pyx_t_29.data = NULL;
+297: progress_bar.update(100)
__pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_progress_bar, __pyx_n_s_update); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 297, __pyx_L7_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; __pyx_t_21 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_5))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_5, function); __pyx_t_21 = 1; } } #endif { PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_int_100}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_21, 1+__pyx_t_21); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 297, __pyx_L7_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; }
298:
+299: return image_particle_field
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_image_particle_field); __pyx_r = __pyx_v_image_particle_field; goto __pyx_L0;